Do you want to learn computer science? A teacher’s guide

As a teacher of computer science (CS) I have led very different types of courses. Indeed the students had huge differences in their background knowledge, from ones that never used a mouse to computer engineers. But my main challenge is to train people in professional development school to have a salary from computer skills. If you would like to learn computer science in 2020, I offer you my vision on how to do it.

This guide intends to be complete and fast, so each item won’t be very deep. At the end of the guide, you can choose your specialization. Either you want to be a backend, frontend, devops or any other area, you have to know the basics. Not only for a good choice but because you need that for your own field.

I use to say that teaching is a tailor-made summary and a summary is, in a certain way, a lie. Today CS is a huge field, with an infinite (from a human perspective) amount of information freely available, so imagine the size of the “lye”. So, here is mine, with all my bias inside. Keep in mind the objective is to learn CS to find a job, in a medium-sized city.

Learn computer science from scratch, a teacher’s guide

  1. Learn English in parallel of CS
  2. Arrange your digital data and make a backup
  3. Start reading feeds in feedly and books in an ebook
  4. Install Ubuntu and switch to it
  5. Learn basics concepts of computer, information and internet
  6. Learn how to use the terminal and the basics of the operating system
  7. The most important: learn to program (Python and Java)
  8. Learn web technologies: HTML, CSS and JS
  9. Learn SQL and basic concepts of databases
  10. Git and GitHub
  11. Specialization

Learn English

If your mother tongue is English, please wait twenty seconds before skipping the chapter. You know you have a big advantage because your mother tongue is the world koiné, so it would be nice if you balance out the situation with some error tolerance and niceness to non native speakers.

In CS the need of English could be an advance of the general trend: English is becoming the language of the world. Even the European Union use it as the main language when is just the mother tongue of 5 million Irish people. Maybe you don’t like it, but it’s a fact, the sooner you assume it, the better for you.

The main secret to learn languages is becoming well known: read it, write it, listen to it, speak it. Assuming you know the basics of the language from school, the rest is just practice. So, here the algorithm that worked good for me and maybe for you. Try to integrate the practice of the language in your daily life instead of going again to that course or expensive academia. Switch the series and films you see to the original version with English subtitles, go to local English talk cafes, make an activity trip with new people from abroad or any other activity which forces you a bit with the language.

In your learning process and during your daily work, you will have to read a lot of manuals and technical texts, so using a dictionary is something you will need forever, no joke, no shame, use WordReference or find a better one if you like.

Arrange your digital data and make a backup

It still surprises me how many people have a mess all over their personal data, and the cloud didn’t help unless you pay the premium for the extra space and you are very organized. Investing in organizing your digital life is always a good bet. Files with photos and videos, documents, books, passwords, contacts, mails and tons of accounts online. Or in other words, your memories, your projects, your studies, your information, your services, your money, your… digital life. And now, add the code, the manuals, the new software… You get the point!

Don’t underestimate the power of folders for file organization, you don’t need something very fancy, just organize in folders, reorganize each year and reorganize again until you are comfortable. The time adds complexity to file organization, but remember you can prefix files or folders with the year or the full date in the only acceptable format (YYYY-MM-DD). Don’t stress, just be organized.

For online accounts, passwords, web bookmarks, articles, my recommendation is Firefox. It’s free, easy to use, very effective and better for you and the ecosystem. The browser is becoming the center of the computer and for a web developer is the platform were the code is running. Again this will mix your daily normal use and the professional, keep things ordered.

Task managers, to-do lists, ideas, important information, notes, links, articles… It’s not easy to have your knowledge base in order, especially if it’s big and broad. I am still not happy with mine, so embrace the unperfect scenario for knowledge management. You have to look for your stack, mine is: browser to save URLs and password manager, pocket for articles, Synology notes for important information, Moleskine paper notebook for ideas, and for the rest I tried trello for a while and now I’m using the trendy notion.so, and of course files and folders. Still not convinced, but the work is done.

Start reading feeds in feedly and books in an ebook

I have failed in my campaign for the use of RSS feeds, like John Lennon sang, but I’m not the only one. Imagine the information goes to you, in the same place, the same format, without ads, only the information you choose not the others or the algorithm choose “for you”. You may say, I’m a dreamer but that exists, and it’s called RSS feed. I know it’s not fancy and yes, I have a twitter account too, it’s also interesting for discovery, for the community and for procrastination. But if you want to follow a topic, a web, a blog, an anything RSS is your tool. Twitter is continuous present if you are not there things pass, RSS is a store where the items wait for you until to read or mark as read. There are several tools for RSS, my recommendation is feedly, but others are good too. And the main tip, try to keep your sources small and avoid super publishers.

RSS feeds are the tool to keep updated with articles. You can imagine how important it is to be updated in super changing subject like CS. But you know what, in the 21st century in this field and I guess in many more topics, books are still very important. Books are the way to get deep in a subject or discover new ideas. Actually, non-fictional books are in a golden age and are a lot of business to spread, summarize and offer the knowledge of books. Since you will be in front of a bright screen and maybe you don’t want to buy a ton of paper, an ebook could be a cheap investment for your brain and your eyes. Any brand is ok, just make sure the screen is eink and has a backlight.

Install Ubuntu and switch to it

Any class, any year: “But teacher, can we make the exercise in windows?” No. “So. Can we make it in a virtual machine?” For your quality of life, no.

99% of my students are Windows users and never have used other Operating System (OS). Nowadays the gap between Windows and Linux is smaller than in the past and it looks they are converging more and more. But Linux is better to learn the details of the Operating System, is the clear leader of servers and is the OS they don’t know.

If you are a Linux user, you can skip this part. If you are a macOS user, you are kind of a Linux user, so it’s up to you. If you are not, go for it, it worth it, even if at the end of your learning process you came back to Windows, you will learn a lot only using your computer.

“There are a lot of Linux distributions, you should choose the one that fits better you needs, taking into account the desktop environment you prefer like Gnome or KDE, the package manager…”. Some open source people have this introduction to Linux to newbies with their better aim. Mine is this: make a backup of your data, and just install Ubuntu (the LTS version) following a tutorial, with a dual boot and start using it. After some time of use and when you enjoy the experience, yes, you can follow that advise and start hacking with other distros.

Why Ubuntu? I can argue Ubuntu has the better user experience, is full of documentation and help on the internet and it worked very good, but this is not a contest, any easy to use distro is ok. I’m an Ubuntu user as my main OS for more than 10 years and I have recommended to a lot of people with very positive results. That’s why I recommend it.

Learn basics concepts of the technologies behind computer and communications

The first days of my classes are the introduction to the world of Computer Science I didn’t have and I would like to. The idea is to give the framework of thinking and the basic concepts of the subject, with a wide perspective of what’s the problem we face. I use to say that are my best classes and I mean it. These are the main ideas:

The digital society

When I was a kid I love to build things, I wanted to be a civil engineer or an architect until my father bought a computer and I started to go to cybercafes. Then I discovered I could build a lot of stuff there and had the feeling that would be huge for humanity. This passion is the one I want to find in my students and in you, that will give you meaning and purpose to the hard work to come. Also, I think is very important to have a historical perspective of what’s happening. The video above is the only one I have seen that help me in that purpose, is a TED Talk in Galicia made by Genís Roca. It’s a pity it has no English subtitles.

The computer

The computer is the tool we will be using as professionals. What is a computer? Are computers these devices: a smartphone, a calculator, a Roomba, the smartTV, the router… What makes a computer a computer? That leads us to the founders of our science like Von Neumann and his Architecture. I think is still present in our computers, because it defines the inner parts from a functional perspective. Usually in my classes that leads us to know which are the main features of computers if you want to buy one. That’s the good part of real time teaching, you can debate, ask for previous knowledge and explain the key doubts.

After the hardware part of the computer is understood, the software part appears and is the most difficult part to explain and understand. First, we see the graphic on the right in which you see the chain of interactions from the user to the hardware. And then we explain the concept of file. Just a bunch of 1s and 0s that can be information, applications, and operating system. Another hard part to explain is why the computer jumps from Software to Hardware.

Unfortunately, I have very few references for you to keep digging, so if you know good material, please let me know and I will share here.

Information

Computer science is the study of processes that interact with data and that can be represented as data in the form of programs. It enables the use of algorithms to manipulate, store, and communicate digital information.

Computer Science, Wikipedia article

The computer is our tool and the information and data is our battlefield. We are just information handlers. But if computers work in binary code and we work with information, how that can it be converted and what are the implications of that?

If a file is just a bunch of 1s and 0s: how a number is stored? How a text is stored? How a photo is stored? How audio? How video? How a website? … What is plain text and formatted text? What is a bitmap and what is a vectorial graph? How does a program source code look like? How any information is transformed in 1s and 0s?

If you want to know the answer to this questions wikipedia is a good source. I wish I had something better to recommend.

Internet

So we have machines (computers) to handle information (in binary code) and now we only need to share that information between machines. So, how can we transform 1s and 0s over physical materials to send information to long distances? Telecommunication.

When you can send information from point A to B, then networks appear. In our case, computer networks, on a worldwide scale: the internet. Internet born as a distributed network, this was an important switch to old paradigms. Now the Internet is in the way to recentralization, but there are always forces pushing back to distributed networks (like blockchain dapps, p2p and others).

Centralized, decentralized and distributed network models by Paul ...

But, in the end, what is the internet? How does it work? Here the main thing is to cover the gap between the classic theory: Internet is a network of computers, and the user experience: I open a browser or and app, I click on the screen and information just appear. Some topics to cover here are this:

  • Client-Server paradigm (they are just roles, both are computers)
  • What is a data center and why servers have to be so powerful
  • What is an ISP (Internet Service Provider)
  • Submarine cables
  • IPs, MACs, LAN, WAN, public IP, local IP, DNS, VPN, privacy in networks
  • The web
  • Domains and Hosting, how to have your own website or mail
  • Advance: cloud computing, P2P, TOR, Blockchain

This script change in any class I give because of the students, but this are most of the topics we try to go through. Again, I wish to have books or content on the internet with this topics from an introductory way.

Yes, I know, too much theory and you want action. I understand, I thought the same in your position. Let’s go!

Learn how to use the terminal and text editors

When I was a student in the first year of my CS degree I thought, really I have to memorize so many commands from an 80’s Operating System (OS) like Unix? Dear past me, I came from the future to tell you: no, you don’t have to memorize but the Command Line Interfaces (CLI) have some advantages and some disadvantages in contrast to the Graphical User Interfaces (GUI), that’s why both are important and live together in CS world. Ah, and Unix CLI (shell, terminal, console..) in its updated version in the Linux OSs and the macOSs are so relevant than Microsoft create a similar one called Powershell. If you can’t beat them, join them; that’s the Microsoft strategy, so they are bringing the Linux kernel and the Unix CLI to Windows. But if you don’t believe me, this essay and the time will change you.

Hands on! The best way to learn the command line is to use it. So I recommend you to make the lessons in webminal website, it will help you with basics in a web terminal. If you prefer a course with a game approach Linux Survival could help. There are tons of courses, games and information, follow your path at your own pace. But the key is, don’t avoid to use the terminal when needed and find the help for your purpose with the “man” command, or ask google or ask your mentor/teacher. In that order.

The good part of learning the Unix terminal is that you learn how the Operating System works: how to handle files, permissions, packages, processes, memory, network. It’s a huge field, don’t feel overwhelmed and don’t stop. it’s a never ending learning (like everything in CS).

Plain text files are the base for OS configuration, programming languages and most things in CS. The simple task of open, edit and save a text file is done infinite times by any CS worker. So the software to do that is pretty important. You have to learn both CLI and GUI editors. This is my choice: nano as the simplest terminal editor, Vim as a powerful editor in command line (to learn just write vimtutor in the terminal), gedit as a simple GUI editor (like notepad or any other, you don’t need tutorial here) and Visual Studio Code as an editor with steroids oriented to programming, category also known as Integrated Development Environment (IDE).

The most important: learn to program in Python and Java

I will be radical, programming is the most important thing in CS. Until now what we have done is prepare ourselves for that. Of course there are works in CS doesn’t need programming and the no-code products are a very interesting and promising path for software. But I believe that any person should know how to program a computer as a basic skill for life, so imagine what I think about a person learning CS for a living.

There are a lot programming languages good, bad, new, old, specific general… Any one can have their own opinions, for example I love Ruby. But this is not about opinions, it’s about which languages are better to learn and get a job, so top languages use to be a fair bet, they are: JavaScript, Python and Java.

Python is a scripting language, it’s very popular for it’s simplicity and is widely used for learning as a first language but also in powerful applications, machine learning and much more. It’s my main recommendation to new learners. There are plenty of free courses to learn python, I use to favor official documentation unless it sucks, so no surprise here, follow the oficial tutorial to learn python3. Once done or mostly done, start making exercises, Exercism.io is a good place to make exercises and correct them programmatically. And of course, you can follow your ideas and start a small project.

The C language programming was the main language of the 80s and 90s, Unix and Linux are built with it, also it was the reference to learn to program at that time. Then Java came as the default language to learn because of the new features like a good Object Orientation and hardiness, soon it becomes very popular for big applications. Since Oracle bought it, it looks less fancy but it’s still very relevant because most of the big companies and public sector software built over Java, so in the software development industry is very relevant. Since is good to find a job and is good to learn Object Orientation, compilation and more is recommended here. Personally I think Java is hard and a bit old fashion (Spring and Kotlin prove it), if I could I would avoid it but honestly, it’s still important. You need it for example to build a mobile app and because you will be a better developer.

Learn web technologies: HTML, CSS and JS

This is an opinion: the web is the platform for developing everything, web technologies will eat the small and medium software and web technologies will rule the software industry. If this is true, then Javascript will be the king of programming languages. Example: Visual Studio Code is made entirely with web technologies thanks to Electron framework, is offered to Windows, Mac, Linux and now directly from a web browser. End of the opinion.

Most people think HTML and CSS are easy, and they are, but thanks to the new versions HTML5 and CSS3 they are more powerful than the previous versions, so a little bit wider to learn. Briefly, HTML is the content, CSS is the styling and javascript is the interaction (and more), in reality, everything is more mixed.

Javascript has reached the top of programming languages in the weirdest way possible. Starting with his bad naming, it was created to make small things in the Netscape browser, the one which lost the browser war, it was hated by most of the computer engineers of 00s because it was poorly designed and it was standardized by a European organization (ECMA). But in the last decade, Javascript became the center of the web, not only in the browser (client) also in the server-side with nodejs and it’s creating a revolution with an explosion of frameworks, libraries and a complete redefinition of the web stack. Actually it has several “flavours” like typescript or the old jquery, for now just go for the pure javascript also known as ECMAScript.

To learn these technologies you have two resources, w3schools is the best to start and learn the important things and the Mozilla Developer Network for an advance learning or to check the specifics of something. You will see JS as a language is not extremely different than JAVA or Python, but the key difference is the context of use: the web.

Learn SQL and basic concepts of databases

Some people look at databases as a mystical thing. It’s just a way to store information, nothing more, nothing less. A file could be a database, in fact, XML and JSON are file types that have the mission of store information. But when the data is more complex and bigger, you have to deal with relations between data, data modelling, avoid information redundancy, security, user permissions, concurrency and more; files are not enough. The strategy is to have a software in between users (you) and data, that software is called the database management system (DBMS) it will control all that but it should be configured properly. So in a database, a user (you) have to access the data through the DBMS, using a specific language called SQL, in the new DBs can be another one, but SQL the one you have to know.

Databases are a broad topic and with the arrival of big data they change a lot in the past decade, but since the ’70s until today the relational databases are the main paradigm and it’s the door to understand the new ones. A relational database is structured in tables and the relations between them. It has a strong mathematical base behind but at the same time is easy to understand in its basic form and very powerful for most use cases.

Learning SQL (Structured Query Language) is a good way to start with databases. I recommend you a practical approach like Khan Academy SQL for starting and Exercism.io to go beyond. After that you should get the main concepts of databases like Primary Key, Foreign Key, Constraints, Join… This series of videos from CMU can help in the conceptual part. There is a world after that either in technical and conceptual terms, but that should be enough for now.

Each database, being strict each DBMS, has it’s own features and implementations, so SQL have a broad common part but also a specific one. It’s important to know the top DBMS available to use. As said, the top 4 follow the relational paradigm. They are: Oracle, the good and expensive; MariaDB (formerly MySQL), the simple, popular and open source; SQL Server, the Microsoft alternative not so good not so expensive and PostgreSQL the advance open source alternative. All of them have their manuals, the trial or full version of the software you can download, install and use. Explore, try, discover.

Git and GitHub

Last but not least, git and GitHub. Nowadays everybody agrees on the importance of this part but a whole generation of CS suffer the lack of version control systems and real-life dev procedures (even in the MIT). I would still say more, GitHub is becoming the public square of the software industry and Microsoft buying it is a master move (buying NPM is a great second move).

But let’s go to the point. Software is a bunch of plaintext files with code, that code is written by several programmers, in several computers, the code changes a lot, a lot! Errors appear, new features must be implemented and there is extra information to store. How to organize all that?

The version control system monitors users and code files to track who changes what and when. That’s called a repository of code. There you have the whole history of changes with each corresponding comment, the versions and much more. The absolute king of control versioning is Git, so that’s a must to learn and it worth to make the effort of knowing well how it works. That means to read and understand the official git book. It’s not an easy read, It’s normal to not understand everything, so re-read and check other sources to understand better and avoid things you think are unimportant after chapter 6.

GitHub started as a git hosting repository, you sign up and you can offer your code repository to other people or to the whole world, you can see it also as a social network of developers. But that’s not all, there are other tools very related to version control like issue tracker, wiki, CI/CD and more. GitHub has become the default place to upload code and is my recommendation, but there are good alternatives like Gitlab, Bitbucket or the old Sourceforge. Since you know git, the best way to learn GitHub is to use it, but they have very good guides to complete your learning process.

Specialization

As said, I consider all of the above as a good base for most CS workers, but this is the start of the path and at this point, you are in a crossroad. Specialization is full of details and fancy names, but I want to offer a general vision of the job market in medium size cities. What are the options you have now:

  • Developer: you program most of your time
    • Front-end: you program in the browser
    • Back-end: you program in the server
    • Full-stack: you program in both sides
    • Mobile dev: you program for mobile phones
    • Other
  • Sysadmin: you are responsible for the operating system
    • Devops: operating system plus operations
    • Cloud expert: sysadmin in the cloud platform
    • Other
  • Database admin: you are responsible for a database
    • Business Intelligence: huge business databases admin
    • Data scientist: data manipulation with statics
    • Other
  • Network admin: a telco job sometimes made by CS people

That categorization is very opinionated (like the whole article) and is very biased to development (like the whole article). That’s not all and for sure you have more categories and much much more subcategories, but that are the main branches.

Other guides

The super complete guide

If you want a complete, full of options and updated guide, I recommend you roadmap.sh, they have a super complete path of technologies. I think it’s useful for inside people but is so so wide, I think it needs a summary and take decisions for the ones can’t assess the options.

The post university guide

If you have studied CS, mainly at the university, you can have some lacks similar to the ones at MIT. They have a very interesting course called The missing semester. They focus on the command line, editors, version control, security and others. I wish I had it when I finished my degree.