Computer Science is a discipline that attacks difficult computational problems by applying scientific principles. Many of those principles have a mathematical basis that predates the advent of computing machinery. From a socio-economic perspective, computer science is central to the processes involved with modern software development. The ACM identifies Software Development Fundamentals (SDF) as a new Knowledge Area of their Curriculum Recommendations-2013, and specifies recommendations of about 45 hours of topical instruction that each CS student should be exposed to in their freshman year. However, specific technologies, languages, and tools are not part of the ACM recommendation. To address that issue here, I have put together a list of modern tools and techniques that I recommend learning for my freshman students, and hopefully useful for any aspiring computer science student in the year 2016.
1. Learn the Unix philosophy, command line and shell basics
Every computer scientist should be comfortable with and practiced in the Unix philosophy of computing, which has proved its worth over many decades. This philosophy boils down to combining “small, sharp tools” to accomplish larger computing tasks. The philosophy points to avoiding captive user interfaces, and instead working on the command-line, building shell scripts, and manipulating and editing flat text-files for data and code. In practice this means IDE-less software development. Shells are the command line syntax and utilities that Unix, Linux, and Mac use. Shells come in many flavors but the most common one is Bash (default on Ubuntu (Linux) and Osx. Here is a short list of shell commands you should know:
- file basics ls, mkdir, mv, rm and their basic options.
- pipes ( | ) and redirects ( > ); these are utilities that allow you to feed the output of one command into another (command chaining) and write the output of a command into a file.
- grep is the file search utility. Also you will need to learn the basics of regular expression (regex) which allow you to articulate what you are looking for.
- tar and gzip are used in common practice for file distribution purposes.
- diff, sed, and awk will become valuable for many large scale editing tasks.
- ssh is network protocol that allows remote login and other network services to operate securely over an unsecured network. It is remarkable that ssh is still not natively available on Windows.
2. Learn a Text Editor and Git
Sublime text is a sophisticated text editor for code, markup and prose and has a slick user interface.You can try it out, while it will nag you to pay for it. (see, http://www.sublimetext.com/) Emacs and vim are the most popular free text editors on unix-like systems, but have steep learning curves, and generally worth the effort. Notepad is the most popular on Windows.
Git is the defacto standard for source control and version control for all modern open-source projects. Companies may still use its predecessors like Subversion, or Concurrent Version System (cvs) or even some proprietary systems like starTeam. However, Git has emerged as the clear victor and will be around for many years to come.
3. Learn a variety of Programming Languages
3a. Learn ANSI C/C++
C is important to learn as it provides the best programming abstraction of computer hardware, however, C is a terse and unforgiving. It remains without rival in programming embedded systems. C++ is an object-oriented programming (OOP) language that extends C, and is still viewed by many as the best language for creating large-scale applications.
3b. Learn Python
Python is a (OOP) programming language that lets programmers be very productive in their work and enables the integration of systems more effectively. Python is a leading language in many computing areas, including Machine Learning and Data Science.
3d. Learn a Web Backend language
Companies like Google and Facebook often rely on several backend languages for their web servers. Popular choices include C/C++, Java, Python, Hack, PHP, Erlang, D, Xhp, Haskell.
4. Learn a Debugger and how to Write Tests
Debugging involves setting breakpoints and stepping through code. This becomes particularly important when working with 3rd party code. Writing tests for small pieces of code “unit tests” early in the development process has proven to be very effective.
5. Learn a Packaging System and a Modern Database
For building software you will need to use libraries and packages as much as you use a programming language itself. Pip is the standard Python package management system and is very easy to use.
Learn to use a hosted database such as Google Cloud Datastore, Heroku Postgres, Mongolab, DynamoDB. This allows you to avoid the tricky configuration and management issues. You don’t have to be an expert in databases anymore to use them because you will most likely use a package that will do all the heavy lifting but you will still need to understand the basics of how your data was stored. In the last decade, a new type of unstructured database has emerged called NoSQL. NoSQL databases store their data in a format (JSON) that can be easily digestable by the web. Know how to build so-called REST API’s, which accept JSON and spit out JSON.
6. Learn HTML/CSS and how to use Browser Development tools
HTML and CSS define the structure and visual style of webpages. Bootstrap is a well-known responsive design tool that helps websites look great on tablets and phones, and jQuery/Ajax is a tool for controlling content in the browser.
Firefox was the first browser to release a very comprehensive debugger called Firebug which allowed developers to really understand what the front code was doing. All modern browsers now have debuggers that can be added as an extension, but Chrome’s developer tools are the most widely used.