3 answers
Asked
963 views
Computer Science Tips?
I just graduated high school, and I'm entering UCSB in the fall. I was wondering if anyone had any general tips for an aspiring software engineer? #computer-science #computer
Login to comment
3 answers
Toshiro K. Ohsumi
Senior Director, Head of Bioinformatics at Be Biopharma, Inc.
24
Answers
Cambridge, Massachusetts
Updated
Toshiro K.’s Answer
Dear Erick,
Here are some things I've picked up along the way:
- One should be able to program very fluently in at least one major programming language. By major, I mean something that is widely used like Java, C++, and in certain fields Python. The analogy here is to a foreign language; you would like to be as fluent as a native speaker. Much like a foreign language, you can get fluent in a programming language by practicing a lot. Write a lot of programs of things you find interesting to do. I wrote small computer games when I was starting out. Then, I got in to entomology and wrote a program to do some taxonomy analysis. It doesn't matter at this point that the code never gets used widely. You just want to gain experience writing code.
- One should learn data structures and algorithms. What is meant here is the study of how information is stored in a computer (data structures) and the study of general concepts of how to make computers do some class of general tasks such as sorting and finding the shortest path between two cities on an idealized map. While you will find most CS majors know the basics, knowing these two well is important. Much like programming languages, you would ideally like to have a good breadth of this at your fingertips. I think it is a really fun field. Machine learning is a branch of algorithms and is a really hot topic now. The canonical book is this one, https://mitpress.mit.edu/books/introduction-algorithms, but please note that it is more for the junior to senior level CS major. I just mention it for future reference.
- Being able to check quickly and well your own code's logic is a critical skill. This is how a coder really stands out. The computer will usually tell you when you make a syntactic error, but will not tell you if you made a logical or typographical error. Checking for logical and typographical error is almost completely in human hands. For example, suppose you meant to add 1 to some number, like y = x + 1, but instead wrote y = x + 2. This sort of mistake is not caught by a computer. Catching your own logic errors is something you gain with experience, as long as you try to understand the root cause when you find bugs in your code. (Believe me, we all code bugs. Catching them is the key.) You can also test parts of your code by feeding the program appropriate inputs values and checking to see if the output matches your expectation. For example, suppose you wrote a program to add 1 to a number. Then you run the program and feed the program the value 3. You expect the number 4 as the output but got 5. Ah hah! You caught a bug. While this is a very simplistic example, the idea of testing the components of a program is vital.
- The second-to-last tip I would give is a little specific to my own experience and may not reflect of, for example, many of my Google colleagues, so please take this with a grain of salt. I found that there is a lot of low-hanging fruit if you know more than one discipline well. For example, you can code and also know molecular biology, you can do bioinformatics or computational biology. (This was my previous job.) Similarly, if you knew engineering, mathematics, and are a good coder, you could check out the Computational Science and Engineering program at UCSB. They have a nice website which tells what they do. Check out the research gallery. (Small world: Prof. Petzold was on my Ph.D. thesis committee.)
- The last tip is make sure to enjoy doing software engineering. Yes, it is a lot of work to learn, but it is also a lot of fun! And, if one is fortunate, it is possible to work on things that millions of people use.
Best wishes!
Thank you so much, I really appreciate it!
Erick
Updated
David’s Answer
The most useful aspect of computer science I ever learned was Data Structures. If you organize your data so that it aligns with the problem to be solved, the program is pretty easy to write. If you organize your data badly, no amount of clever programming will save you.
That said, you do have to know some programming languages. Computer languages are a buffet choice. Every language has to deal with the same concepts, so there's a lot of overlap. For the application data, the language must represent numbers, strings, and arrays (sequences) of those things. For the execution steps, the there are basic computational steps, comparison tests, loops, and functions (subroutines). All languages have these basic concepts. Once you learn them, in any language, your next computer language will come much more easily. I learned my first language, BASIC, in six months. The second (PDP-8 assembler) required six weeks. The third (6502 assembler) took me six hours.
Since all languages will give you the same concepts, pick reasonably widespread languages for your first efforts. Python is very popular for behind-the-scenes system administration tasks and for network services. Completely free tools and learning courses are available on the web, and Python executes on almost any computer you have. Python programs generally don't have much of a graphical display to them, though. For that, the easiest way to get anything displayed is to delegate the task to your web browser. Fortunately, all modern web browsers have a programming language built in. It's called Javascript. If you can display something in a web browser, you can give it animation and bring it to life by tying it to Javascript. Once again, many learning resources are available on the web for free. (One word of caution. Despite the similar sounding names, Javascript and Java have nothing whatsoever to do with one another. Be sure you're reading the information for Javascript.)
Data structures and computer languages give you the basic tools to solve a problem, but they don't help you organize your approach to the solution. A software engineer is more than a programmer. Software engineering is about a structured regularized approach to creating programs that correctly solve the problem, do it efficiently -- both in the amount of human time required to create the program, and the machine resources necessary to run it -- and can be maintained, extended and reused for similar future problems. In software engineering you'll learn about the boring-sounding but crucial items like requirements documents, change control, milestones, dependencies, and automated testing.
I recommend you tackle one programming language first. Move on to data structures, and save software engineering for last. It will help if you've created a few programs on your own before you tackle software engineering. It will help even more if you've had to revisit those programs later to add new features.
That said, you do have to know some programming languages. Computer languages are a buffet choice. Every language has to deal with the same concepts, so there's a lot of overlap. For the application data, the language must represent numbers, strings, and arrays (sequences) of those things. For the execution steps, the there are basic computational steps, comparison tests, loops, and functions (subroutines). All languages have these basic concepts. Once you learn them, in any language, your next computer language will come much more easily. I learned my first language, BASIC, in six months. The second (PDP-8 assembler) required six weeks. The third (6502 assembler) took me six hours.
Since all languages will give you the same concepts, pick reasonably widespread languages for your first efforts. Python is very popular for behind-the-scenes system administration tasks and for network services. Completely free tools and learning courses are available on the web, and Python executes on almost any computer you have. Python programs generally don't have much of a graphical display to them, though. For that, the easiest way to get anything displayed is to delegate the task to your web browser. Fortunately, all modern web browsers have a programming language built in. It's called Javascript. If you can display something in a web browser, you can give it animation and bring it to life by tying it to Javascript. Once again, many learning resources are available on the web for free. (One word of caution. Despite the similar sounding names, Javascript and Java have nothing whatsoever to do with one another. Be sure you're reading the information for Javascript.)
Data structures and computer languages give you the basic tools to solve a problem, but they don't help you organize your approach to the solution. A software engineer is more than a programmer. Software engineering is about a structured regularized approach to creating programs that correctly solve the problem, do it efficiently -- both in the amount of human time required to create the program, and the machine resources necessary to run it -- and can be maintained, extended and reused for similar future problems. In software engineering you'll learn about the boring-sounding but crucial items like requirements documents, change control, milestones, dependencies, and automated testing.
I recommend you tackle one programming language first. Move on to data structures, and save software engineering for last. It will help if you've created a few programs on your own before you tackle software engineering. It will help even more if you've had to revisit those programs later to add new features.
Updated
Max’s Answer
While a lot of schools group computer science in to one degree problem there's so many different avenues you can go down for your career path. You can get in to machine learning, web development, robotics, education, etc. Now a days just about every industry is been helped and influenced by software. You can use this fact to try a wide variety of courses early on in college and try and figure out what interests you the most.
For me it ended up being web development. I ended up taking a set of courses that most lined up with that end goal in mind such as studying databases and web server deployment. Every university these days has a website and that website or some subset of websites hosted by the university is run by students. So I ended up finding an on campus job at the university doing web development. I learned more in that job than I did during my years in university. In fact when I look back on my career I see that a lot of the things I know today about software engineering I ended up learning on the job. So don't feel discouraged if you start a software engineering job and feel like you know nothing. You'll get it down in no time!
The other half of my programming knowledge mainly comes from hobby projects. I spent time in high school and college on robotics team and learned programming that way. I also spent time making websites in the early days of the internet so my friends and I could chat with each other on forums. Whatever your hobbies may be try and find a way to integrate programming in to them. As an example, in college I built a simple app that took in a list of fast food restaurants and picked one randomly to eat at.
Often times the programming language for a course will be predefined and differs from school to school. Most software interviews will actually let you choose whatever language you want during the interview so don't worry if a job requires you to use Python, but your school only taught you Java. Picking up a new programming language usually isn't very hard.
It's definitely important to learn algorithms as they'll be the basis for hard problems you have to solve in your career. Additionally, for better or worse, most programming interviews focus on algorithms even if they aren't relevant to the job. An example could be needing to solve a problem in an interview that requires you to sort some data, but the interviewer wants you to implement the sort yourself rather than using a language built in sorting algorithm. 99.9% of the time you'll be able to use the built in sorting algorithm once you have the job and for the other 0.1% of the time you can just search the internet for the answer. When working on large scale problems with billions of data items you'll need to understand the trade offs between the various sorting algorithms. All I can say here is pay attention as much as possible in your algorithms classes. They'll be your key to employment after school.
tldr: Find whatever got you in to programming and double down on that. If you're having fun keep doing it. If not change it up and learn about programming in a different field. If you spend time studying algorithms, you'll be able to switch much easier and explore so many things. Have fun with it!
For me it ended up being web development. I ended up taking a set of courses that most lined up with that end goal in mind such as studying databases and web server deployment. Every university these days has a website and that website or some subset of websites hosted by the university is run by students. So I ended up finding an on campus job at the university doing web development. I learned more in that job than I did during my years in university. In fact when I look back on my career I see that a lot of the things I know today about software engineering I ended up learning on the job. So don't feel discouraged if you start a software engineering job and feel like you know nothing. You'll get it down in no time!
The other half of my programming knowledge mainly comes from hobby projects. I spent time in high school and college on robotics team and learned programming that way. I also spent time making websites in the early days of the internet so my friends and I could chat with each other on forums. Whatever your hobbies may be try and find a way to integrate programming in to them. As an example, in college I built a simple app that took in a list of fast food restaurants and picked one randomly to eat at.
Often times the programming language for a course will be predefined and differs from school to school. Most software interviews will actually let you choose whatever language you want during the interview so don't worry if a job requires you to use Python, but your school only taught you Java. Picking up a new programming language usually isn't very hard.
It's definitely important to learn algorithms as they'll be the basis for hard problems you have to solve in your career. Additionally, for better or worse, most programming interviews focus on algorithms even if they aren't relevant to the job. An example could be needing to solve a problem in an interview that requires you to sort some data, but the interviewer wants you to implement the sort yourself rather than using a language built in sorting algorithm. 99.9% of the time you'll be able to use the built in sorting algorithm once you have the job and for the other 0.1% of the time you can just search the internet for the answer. When working on large scale problems with billions of data items you'll need to understand the trade offs between the various sorting algorithms. All I can say here is pay attention as much as possible in your algorithms classes. They'll be your key to employment after school.
tldr: Find whatever got you in to programming and double down on that. If you're having fun keep doing it. If not change it up and learn about programming in a different field. If you spend time studying algorithms, you'll be able to switch much easier and explore so many things. Have fun with it!