Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: I don't have CS and feel flustered
20 points by apineda on May 6, 2014 | hide | past | favorite | 18 comments
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.

I created an account just to reply.

I 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.

> 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.

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.

I would like to second "learn something new each *" (for anybody, university degree or not!). It is great if you can do so on your own. If you have a hard time, you can change your situation (pay money to take courses, work through free courses online, get a mentor, study with others, work on open source projects, etc., etc.) in order to get yourself to do the necessary work to learn [relevant] new things regularly. Note that the key is yourself, not external factors: you simply have to do the work.

Hey thank you this is an answer for the ages, I appreciate it. You've given me a different way at looking at my situation. I do have access to the same resources and I should capitalize more on that, much more. I do have a buddy I meetup with every Wednesday to work on a new meteor project. We just started doing that. I think part of my situation is that I'm forced to spend time at a place I feel is a bit backwards technically speaking. The upside is that I get to deal with all sorts of business affairs and lead a small team. My business skills have noticeably improved. I'm also not working hard enough. I know part of that is lack of exercise bit. It just feels like I want to run through the screen but in reality I just need to go for a run.

If you stay with your current job and do not go to university, here are some concrete ideas for things that you might want to try, which I would recommend based on what you wrote:

* 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!).



* 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.


I have many other ideas, but I decided to stop here in order to emphasize those above. :)

Thanks. I love C and I love assembly tutorials. I got through about half of K&R. I should see it all the way through. I also have the algorithm book but it's unopened. :o I have the desire it just feels like quite the mountain. Maybe I'm making it feel bigger by just not walking it? Or walking it alone. Thanks for your advice it reinforces my thinking.

You could watch the video lectures instead of or in addition to reading the algorithms book.

I've seen quite a few of these and thought they were ok:


This one is newer though:


I guess I would check out both and see which professors I like the best :)

I would highly recommend Harvard CS50. Everything is available on the course website, https://cs50.harvard.edu/ . There is a linux appliance with a console utility that allows you to submit problem set solutions for automated testing/grading.

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.

Good idea, I'd like to add that after you get some know the basics of C to pick up K&R and do the examples. Also go to the local city/uni library and pick up an old book on UNIX utilities (AWK,SED,GREP etc)

I'm not gonna lie to you, many - MANY places you interview are going to do the "CS Secret Handshake". They may have you whiteboard some problems to see how you think. (this is completely legitimate) But they might ask, "ok, so tell me about the efficiency of this algorithm in Big-O notation." You can learn that! Many tech interviews are done by tech people that have no interviewing skills... so they go look up ridiculous interview questions on google, and ask you to solve them. Then they don't do YOU the favor of letting YOU look up solutions! You can combat this by learning how to solve problems methodically. I agree with the other commenters about learning data structures and algorithms as a bare minimum. Then do something like Rebecca Murphy's JS-Assessment (if you're into Javascript). A bunch of math is no substitute for raw problem solving talent... although they often overlap.

Re: CS Secret Handshake--years ago, I found the Programming Interviews Exposed book. I own the first edition. It's a lot of concise explanations of different Computer Science topics. The authors focus on things that are likely to come up in an interview. The book provides a few tricks and an orientation to topics that are worth looking at further.

Yeah i'm struggling with this aswell - I basically dropped out of the danish HS-equivelant.

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.

Google is just a small sliver of the cool companies to work at. They hire top tier tech guys because they can afford it, but 99% of them aren't going to get rich working there. Microsoft, Apple and Sun used to be the places to work, before that IBM and Intel. Find the next google and be part of it.

Ok, you're 27. Suppose it takes you 7 years to get the mathematics background for CS. Odds are you will still have 50+ years to do the sort of work you want to do with the kind of people you want to work with. [1] And the key is the maths. Once the mathematics gets beyond a person, they can follow along, but can't really do the task independently and mathematics is hard for many people.

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.

Some of the best programmers I have seen have a non-CS background, and were self-taught.

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.

For points 1 and 2 coursera.org has a great set of courses on algorithms[1], Taught by a Princeton professor. I started the first one a couple of months ago, but had to drop out because of time constraints. I've re-enrolled for the upcoming section. It has a companion book, Algorithms[2], that I bought which was a great help. I don't have a copy of CLRS[3] But I've heard it is also a great reference and is on my amazon wishlist. Other than that, MIT's OpenCourseWare[4] also has the entire CS degree online for free. It's funny, reading your post I thought I hide sleep posted or something. You seem to be experiencing exactly what I'm going through. I'm also 27 and don't have a CS degree. I am highly motivated though, and have no problem hacking at this stuff on my own. I've talked to a bunch of CS majors who actually still feel inferior after they graduate so other than helping the impostor syndrome[5] that I suffer from, I'm not sure that a degree would do me a lot of good. (With the exception of padding my resume and getting me in the door for an interview). [1] https://www.coursera.org/course/algs4partI [2] http://amzn.com/032157351X [3] http://amzn.com/0262033844 [4] http://ocw.mit.edu/index.htm [5] http://en.wikipedia.org/wiki/Impostor_syndrome

If you watch Silicon Valley (HBO) episode 1, there is a character who is fairly adamant about NOT going to uni / doing CS!

Some people here are talking about you studying CS topics on your own. So let's say in August you start spending nine hours a week studying some topic - say, theory of computation. You spend nine hours a week studying it from August to December.

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.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact