Ask HN: I don't have CS and feel flustered
I'm 27 and I have been programming a long while but am missing CS, it's hurting on the job front and confidence front. It would be a lot easier to have cool demos on git if I had some kind of CS related "solution" there to show. I'm becoming flustered of only being able to do CRUD solutions etc. I want to be working with people of higher calibre and I feel I cannot gain that entry (eg. Google as the prime example) without CS or some kind of micro-focus of CS. I'm afraid of tackling some topic (eg. linear algebra) then being shut down because there are 100 other topics, or that half of linear doesn't do me any good anyway, or I should be working on a meteor.js demo for practicality. Part of the frustration is that I don't work around CS people and so I'm stagnating in an area I feel is important to me. I first got my job (co-op and stayed on) and worked under a great engineer and had a great time but he left about 8 months after-ward and ever since then it hasn't been the same. I struggled since HS without a calculus/vectors course (and without foresight taht it would limit my entry into programs). I've since done some calculus but do not have credit. Should I just do it online, get the HS credit, and apply for CS at a uni? I think I will be taking too much of a step backward but I don't see how else I can shake this limitation.
18 comments
[ 4.9 ms ] story [ 43.9 ms ] threadI have been working successfully in the technology industry as a Developer for over 10 years. I have recently left a job where I led a good-sized team of Developers and I now run my own company.
Through countless interviews and meeting with clients, I have been asked exactly 4 times about my degree and educational background. I don't have a degree. No one cares. They do care about what you have done (experience, portfolio) and what you can do for them (your value).
Information Technology is perhaps the most accessible industry:
* You have access to the exact same tools as a Senior Developer at Google. How much did you pay for Apache, PHP, Angularjs, Go, Dart, Javascript, CSS, HTML, Ruby..etc. $0. All you need is a laptop and internet connection. For a few dollars a month you could even deploy your app to the same massively powerful technology infrastructure which a Senior Google Developer uses (Google App Engine). Do you know how lucky you are to have access to the same resources?
* If you wanted to be a Lawyer or Doctor or Accountant.. you would HAVE to go to school and get a Degree. Online you can find documentation, tutorials, discussion boards.. everything you need to learn. I would rather learn online myself than accumulating tens of thousands of dollars of debt to learn the same thing.
You are focusing way too much on what you don't have.
> I'm becoming flustered of only being able to do CRUD solutions etc.
There is NOTHING stopping you from learning more than CRUD solution.
> or I should be working on a meteor.js demo for practicality
There is NOTHING stopping you from working on a meteor.js demo.
Perhaps you feel alone and feel University would provide you with the structure and guidance you need. My advice is to find a good friend who is as dedicated to learning as you are. Have your own classes twice a week with your friend where you learn something new each class. (E.g., meteor.js). Try that for 4 months. Work hard at it. After 4 months if you are not progressing, then look at University as an option.
In addition to that, you can also attend local meetups on subjects (Civic Data Hacking, Python, Meteor.js, etc...) that interest you. You'll learn more about the subject and you'll meet other people who have experience in it and can provide guidance on learning it.
* Learn C. I have heard good things about _Learn C The Hard Way_, which is free, though I have never used it myself. Since you want to know more "CS," work through _Introduction to Algorithms_, a pretty standard (second-semester) university text, in C (NOT a language than manages memory for you!).
http://c.learncodethehardway.org/
http://mitpress.mit.edu/books/introduction-algorithms
* Work through _The Elements of Computing Systems_ (aka "From NAND to Tetris"). The book is fun, and it introduces many topics that are more advanced than CRUD.
http://www.nand2tetris.org/
I have many other ideas, but I decided to stop here in order to emphasize those above. :)
I've seen quite a few of these and thought they were ok:
http://videolectures.net/mit6046jf05_introduction_algorithms...
This one is newer though:
http://ocw.mit.edu/courses/electrical-engineering-and-comput...
I guess I would check out both and see which professors I like the best :)
The moment I knew it was a good choice for me was after I completed a problem set that required us to write sorting algorithms.
My prior experience was with Ruby and JS, so .sort() => done, no idea how this mysterious .sort() was returning my ordered set. After the lecture and writing the algorithms, I didn't just have the code as you would following a tutorial. I had a better understanding behind "the magic". I understood how to evaluate the performance of these algorithms using Big O notation and why my Google killing search engine won't do much Google killing if I use bubble-sort.
Give it a try. You'll get a good introduction to CS and write some cool programs, including a program that can recover "deleted" images from a memory card.
I think i'm a pretty decent coder, but i have next to none experience with algorithms - Usually i'm pretty good at learning new things just by trying out and reading up on them (server management, new languages etc).
Algorithms is the one that really seems to require an education, i'm having a hard time learning that stuff on my own - But i'm giving it a go by working my way up to linear algebra on Khan Academy and reading examples on Naive Bayes etc.
But it's nothing that can't be done if you're willing to grind it out. That's probably true for everyone, it's just that some people have the advantage of not knowing they are grinding it out.
Good luck.
[1] And in the Dear Abbey tradition, you'll have 50+ years of not working on things you want to work on with people you want to work with if you don't get the maths under your belt.
Based on how I interview (and also on various interviews I have attended), here are some suggestions on how to begin:
1) Start with some basic data-structures: a) Arrays b) Linked List: both single and double c) Hash Tables d) Binary Trees with some familiarity to one or two types of balanced trees - e.g. Red-Black and/or B-trees. e) Stacks and Queues - built on arrays and/or linked-lists
If you can practice it with writing some code in C or Java, that would be a big plus. You can get a hang of the aforesaid structures by coding the usual functions - find an element, insert, modify, delete, iterating through all the elements etc...
As you are doing it, get a feel of the big-O notation - i.e. understand the various tradeoffs on why you would pick a certain data structure to solve a particular problem
2) Get some exposure to search and sorting algorithms and understand the various trade-offs - maybe start with linear and binary search, insertion sort, merge sort and quicksort (for the latter two, you will get an idea of divide-and-conquer strategies, recursions and so forth).
Most advanced data-structures/algorithms are built on the aforesaid foundations, so with (1) and (2) alone you have strengthened it, and based on your interest, you can dig down further if needed to related areas - e.g. graphs, linear algebra problems etc...
3) Get an exposure to OS/System level programming if possible - e.g. if you choose Linux, you can get some idea of processes vs threads, schedulers, memory mgmt, file and network IO etc.. At the very least, writing some toy code here, say opening files, forking a process, socket IO and so forth will give you some practical exposure.
4) HTTP/Web services: You already mentioned meteor.js so it looks like you are already familiar here esp. with tools like Firebug to see raw HTTP payloads and so forth.
5) Databases - SQL, and maybe some NoSQL use-cases.
6) OOP and Design Patterns
As you get a grip on the aforesaid areas, the more code you read, it will add to the practical use-cases. For some of the topics, you could get familiar with the area using any of your favorite scripting languages (including posix functions for point 3).
Give yourself ~ 6+ months and get as much exposure with practical use-cases.
Well, if you are taking one class a semester at your local public university this fall, you would be spending three hours a week in class to do this.
You're going to have to spend 9 hours a week from August to December studying, say, theory of computation, in order to get a BSCS level grasp of it. Why not spend 12 hours a week doing it, and actually getting a BSCS in the process? You'll also get a professor you can ask questions of during class, after class, during office hours, and probably other times. There are other benefits of going to school as well.
One of the biggest problems if you don't have a BSCS, is you don't know what you don't know. If you don't understand how floating point numbers are stored in memory, at least you know you can always look into that. The real problem is when you don't pursue a solution because you don't even know it exists.
I tried to write a multi-threaded C program with changing state before I took a class in mutual exclusion. The results weren't pretty. After the class, I had to deal with another mutual exclusion problem - a somewhat tough Java mutual exclusion problem in some production code. I was able to fix it fairly quickly. When you're writing code and realized you need some feature, often it's simple. When a program progresses to where you need threading and mutual exclusion - most people don't stop what they're doing and spend a few weeks studying mutual exclusion like they would have in college. They just plow through it which is why people complain about bad threading in code so much. A BSCS gives you that background you were always lacking.
Also, the tendency for someone doing this on their own is not to spend four months study calculus, then four more studying calculus, then four more studying calculus, then four more studying discrete math, then four more studying theory of computation, and THEN studying C++ for four months. Usually people on their own are just going to skip the more theoretical stuff and jump right into the immediately practical stuff - straight to C++. But then they will never have the background required - they never took graph theory, so data structures such as directed acyclic graphs are hard to understand.
There's always something to learn, but a BSCS gives you a good foundation and background to build off of. People here are saying you can do the three years of study to cover a BSCS education on your own. Which you can. So why not actually spend four years - the one hour in class for the typical three hours of homework. Do four years instead of three and get the actual BSCS. You can go at night, weekends, online (but don't do a scam one) etc. Many professors are alright, a few are very good and only one where I went was a poor teacher.