27 ms·
I'm an engineer. No CS degree. I coded for fun on various side projects from 2006-2012. I didn't consider myself very good. I worked at a couple startups from
by cj 7y ago
I'm an engineer. No CS degree. I coded for fun on various side projects from 2006-2012. I didn't consider myself very good.
I worked at a couple startups from 2012-2013. During that time, I became very proficient in Coffeescript and a couple popular frontend frameworks. I was very productive in terms of pumping out lines of code (that somehow resulted in a working product).
However, I didn't know how to write a for loop. If you had asked me what "for...in" was, I wouldn't have had a clue. And forget about asking me how setTimeout has to do with the call stack.
The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day.
In 2013, I began to realize my (glaring) deficiencies as a programmer. That was the point when I started spending all my free time doing online CS courses. They helped a lot with filling in the knowledge gaps that I didn't even know I had.
The main reason I'm posting this is to give a shoutout to Project Euler.
Project Euler (https://projecteuler.net/ https://projecteuler.net/) is an amazing way to test yourself (and learn) CS concepts. If you've done a coding bootcamp and want to do a "gut check" to see how much you learned (or how much you have left to learn), I'd highly recommend Project Euler.
(I'm happy to say that in 2019, I can write for loops all day long...)
- ska 7y ago> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you This is absolutely key. One of the main advantages of a solid undergraduate curriculum is that it forces you to work your way through things that are important, but don't interest you as much. And this path is designed and supported by people with a much better broad view of the field than you have. Now, you'll still always gain knowledge faster in the areas that interest you most, but if you only indulge this approach you will have significant gaps. One thing I always recommend to people self-studying (when they ask) is to find someone you trust who really knows the area and ask them for recommended courses/books. Then follow that advice. To some degree MOOCs etc. try and do this for you by designing course progressions, but there are limitations and constraints there that can have you spinning your wheel. Being disciplined about both breadth and depth in a new subject is difficult. One of the underlying themes of a post-graduate degree, particularly a PhD, is to give you tools to do this for yourself repeatedly. It's not impossible to gain these skills properly with little or no formal education, but it is quite difficult.
- jeffdavis 7y agoI think it depends on the person and the experience. It's easy to say that a particular course was helpful, because it often is. But what's the opportunity cost? What other things didn't you learn because of all that time learning about, say, OS schedulers? Also, it assumes that you have access to a very high quality education. In lots of cases, the teaching might be mediocre (perhaps even at elite universities that care more about research grants than education). There's a lot of value in having a standardized base of knowledge, where you learn all the things that a practicing engineer should know. But in reality, the sum of things you "should" do takes more than a lifetime. And you have to find some ways to differentiate your knowledge and expertise if you want to innovate.
- ska 7y agoYes, nothing is perfect. But in general, it is hard to be a good guide to yourself in a new area. You can do it, but it is a skill that needs to be developed and most people don't have it (or rather, they typically have the depth-first part but not the breadth-first part, if that makes sense). I wasn't even talking about the course quality (which as you note, is very variable) but about the curriculum. One thing you can do as an individual teaching yourself CS, say, is to try and follow the curriculum of a known good CS program. There are issues with this, too, but at least you are getting some guidance. The opportunity cost issue is a good point. One problem with following undergrad programs, say, is that only part of what they are doing is teaching you material, the other part is learning-how-to-learn stuff. If you are an independent learner of sufficient skill, some courses will be way too slow for you. It would be optimal in some sense to have high level "key concept" material that you can survey efficiently and then decide when and where you need to dig deeper. It's a bit of a chicken and egg problem though, because if you are insufficiently skilled you will do poorly at the second part...
- tracker1 7y agoAs mentioned in another comment for this post, Cracking the Code Interview is probably a good place to start in terms of reviewing some key concepts, assuming you don't have a CS degree and are largely self taught. Of course given the libraries and systems already available, you don't practically need a lot of this knowledge, but it does help. When certain portions of an application just don't perform well, or when you hit really weird side effects of race conditions on static properties etc. I think it's also important to know the language and tools that you are working with as well as possible. It's not always possible to know everything, but you should probably read and complete at least one book on the language you are using. You can hack away in any given language for years. But until you've actually read cover to cover on a comprehensive book, you won't necessarily understand some concepts, or better still you will learn how the language does something for you, that you've been doing the hard way.
- Nevermindmyview 7y agoWhat kind of coding did you do for 6 years if after that time you couldn't identify a for-loop?
- whatshisface 7y agoThe parent said they didn't know what for-in was, which implies they were using a language like C for their side projects which only has for (i=0;i<n;i++) loops.
- k_ 7y agoThat or they only used `while` (and friends if available in the language) loops.
- bluedino 7y agoYou can google that in 2 seconds. A CS degree isn't going to help you there if you have not covered a language that uses iterators.
- saagarjha 7y agoAny self-respecting computer science degree education should cover at least one language that has iterators or enhanced enumeration.
- cabaalis 7y agoMy CS degree (2002-2006) did not explicitly cover "for x in y" iterators. But it did cover an understanding of algorithms and data structures well enough that I could implement one. Which is better? YMMV.
- 0xDEFC0DE 7y agoThat was probably before they were really in style e.g. C# didn't add foreach / iterators until ~2005 with v2.0 and your curriculum probably lags a bit behind the industry state-of-the-art unless it was Ivy league
- HomeDeLaPot 7y agoRight on! Plenty of people can teach themselves to code without a university education. But the degree gives you a broad exposure to parts of CS that you may never explore as a self-taught developer. And it gives employers confidence that you have the skillset to handle whatever they throw at you.
- ej12n 7y ago> And it gives employers confidence that you have the skillset to handle whatever they throw at you. Blindly having confidence in someone with a degree vs. someone with no degree is a bad mistake in this industry, IMO, sadly it happens. It really comes down to the person, self taught or not, if you don’t pursue continuing education (which is a must in this industry) whatever CS knowledge you learnt with your degree will only take you so far. Also said “broad exposure” can be well… self taught as well, algorithms, data structures, OS, etc… all things you can learn and "master" with no CS degree. With all that said, I do agree CS education is essential to become a better developer. As a self thought myself, learning CS has made me a way better developer for sure, and I would advise all self taught devs to do the same, it will pay off immensely and best of all no student loan to repay.
- erikpukinskis 7y agoI think you’re missing the point your parent was making... In a good CS program you will be presented a series of challenges below your “depth”.... “wait, you want me to WRITE a data structure? I usually just use a good one from a library” “wait, you want me to fix a compiler? I have only ever run a compiler” “wait, you want me to write code that CREATES processes out of nothing? I am used to letting the OS create processes” ... etc. These provide you a series of epiphanies, “wow, I can build a compiler from scratch, that means I could fux with LLVM if I had to”. Ideally, these programs are designed to take you all the way down to the bottom of the machine. For some students, the end result is confidence in their ability to “dive in” to a problem anywhere in the system. If your point is that you can teach yourself that outside of school—absolutely. But... well, in my case I doubt I ever would have. It wasn’t fun, I was pushed to do things I would never have followed through on if I was just casually teaching myself about programming languages or operating systems. And if your point is that students can get away without learning the material—well, also yes. Of course. But you are wrong to dismiss the idea that a CS degree is just another few things to learn. This business of “get all the way down to the bottom and challenge yourself at every step” is kind of the whole point of a CS degree, and the world outside is not going to encourage you to do it the way your profs will.
- s_y_n_t_a_x 7y agoSelf taught, I remember loops were the last thing I learnt as a kid when I was working on my own Tibia servers using Lua. I remember the day it finally clicked. It helped having a forum where you could ask more experienced people to explain it plainly.
- rhacker 7y agoSelf taught from ages 9-18, Qbasic -> C -> C++ -> PHP I did go to college and learned Java and UML and a few other esoteric things - until I got into my data structures classes. If a self-taught software engineer feels like something is missing, take a few data structures classes. That helps a lot. But yeah, self taught can take you pretty much anywhere unless the job reqs prevent it.
- lerax 7y agoNice to see that reference about projecteuler. Although I study Computer Engineering, which is very close to Computer Science with Electrical Engineer grade, I really focus too much in the subjects which interests me. BTW, I reforce a lot of aspects about analysis, optimization and programming with ProjectEuler by doing Polyglot programming with some friends: https://github.com/DestructHub/ProjectEuler https://github.com/DestructHub/ProjectEuler
- jchw 7y agoThis is interesting, but I don't think it's the norm for self-taught devs to not recognize a for..in. I would find that surprising. (I'm also a self-taught developer, and now I work at a larger corporation.)
- tempsy 7y agoIs Project Euler better than LeetCode for "gut checking"? I've probably done 300 or so LC, and do some every week, mostly as an insurance policy for technical interviews if I ever opportunistically interviewed in a short time frame.
- n4r9 7y agoThey're geared towards different goals. LC is for interviews: solving small scale problems of the scale you might get asked in an interview or come up against every day in a software job. PE is more of about curiosity and personal intellectual development. It asks something that you might never have heard about and might never see again but is often very interesting, and will stretch your ability to develop your own algorithms or to apply learnt methods to unfamiliar scenarios. I'd recommend LC to someone who has an interview in a month, PE to someone who has one in a year.
- steev 7y agoI would say for technical interviews you should stick with LeetCode. Project Euler is more mathematics oriented.
- tzs 7y agoSpeaking of LeetCode, don't overlook the discussions for each problem. I think a lot of people just solve the problem, and then move on to another problem. In the discussions many people post their solutions, and those often have bugs in obscure cases that the LeetCode grader doesn't hit. Another common thing is for the posted solutions to always give the correct answer, but miss the time or space constraints that the problem statement asked for. I've found that reviewing those other solutions to find those issues to be quite instructive. Also, there will sometimes be a solution in there that is better than mine, which is also instructive.
- vectorEQ 7y agoi agree. i'm happy to have some CS students point me to some areas which are useful even if they are not interesting for hobbyists. There's also a lot of value in learning academic methods of investigation and research (if you are at a good university). A lot of self-taught learn a lot about computers or some programming languages, but a CS degree like any degree also teaches a lot of other valuable competences which can be hard to come by from own inspiration / initiative. Another thing is that following and completing a degree is a practice in going from start to finnish in a multi-year project which the degree is, which is also very valuable in life in general. being able to see fruits in the distant future of your current work, and having that motivate and drive you. A lot of people i meet who are self-taught will give up more easily due to this. not that they are quitters, but they tend to lean towards their interests, which is not always in their best interest :)
- balls187 7y ago> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day. Which is not necessarily a bad (for whatever definition of bad) thing. For the startups you worked at, your ability to write code was far more valuable than your understanding of underlying CS concepts. Kudos to you for having the maturity to acknowledge the gaps in your education and to address them in a manner that complements your life.
- pmarreck 7y agoEnumeration is way better than for-loops. No off-by-one errors possible. Just sayin'. ;)
- dcole2929 7y agoI've been really involved in teaching people with non-traditional backgrounds (e.g. no cs degree) to program lately, and this has been my biggest struggle. There are people who are working in the field as a web dev and have been for years and can't do simple stuff like iterate. They have no understanding of what the stuff they're actually doing means or does. It's just copy and pasting snippets they see online and fiddling with it til it works. I've taken to offering three pieces of advice to these people: 1) Go through the basic language tutorial of whatever language you use (e.g. how to declare variable, conditionals, loops) 2) Go read through the essentials guide to your languages (will be slightly higher level stuff) 3) Go read the sections on Data Structures, Concepts and Algorithms and Knowledge Base in Cracking The Coding Interview skipping the problems that aren't answered in chapter. Why? Because it's a solid primer for CS Concepts that people just don't pick up unless they have to, and most importantly short enough (< 100 pages) people will actually go through it. Large CS books with the dense writing intimidate people and so they never follow through. I've had a lot of success with this method. It's not a formal cs education by any means but I've found it's enough to get people past the constant beginner part.
- fishmm22 7y agoIt is funny that people constantly mention these supposed developers who have jobs but cant program. Where are these jobs? I have a recent cs degree, did resume coaching, and worked through a couple coding interview exercise books. Still having trouble finding work. Show me one of these mythical jobs poorly trained programmers get, I will blow them out of the water. In reality I think most of those jobs have been outsourced and no longer exist.
- astura 7y agoOh, they exist, I've worked with a few. Luckily, no more than that. We all know hiring and interviewing are basically a crapshoot. Good people sometimes don't get hired and bad people sometimes do.
- lordCarbonFiber 7y agoApply for bank outside of a tech hub, or any job outside of the major US cities. There's plenty of positions full of people riding the "expert beginner" status, blissfully unaware of how far behind they are because top performers leave for the hubs and the better opportunities offered there.
- d0paware 7y ago> The problem with being self taught, at least in my experience, is that you end up being very strong in whatever areas it is that interests you, and whatever areas of CS are relevant to the projects you're working on day-to-day. I think this is the case even if you receive a formal CS education. I picked the most difficult or interesting classes and got As in them, and barely passed everything else in order to graduate in 4 years. Many students avoided the hard professors to protect their GPA, so it was really easy to register for them since 25% of students might drop the class. Probably the most important thing a formal CS education does is expose you to CS fundamentals, but in my experience you end up having to be self-taught in a university setting anyway. Most of the professors I had were more interested in research than in lecturing - many lectures were completely incomprehensible. And even with amazing lecturers, I would still have to spend hundreds of hours reading and practicing on my own. One of those classes I barely passed was algorithms, since my other workload was too great. I eventually had to self-study this subject years later to pass the tech interview torture chamber. College was mostly an exercise in self-learning or learning how to learn for me - something I am still reaping the benefits of today.
- oswamano 7y ago> College was mostly an exercise in self-learning or learning how to learn for me Definitely agree with this. I think my data structures professor spent more time talking about chess rather than data structures.
- decebalus1 7y agoI'm a doctor. No medical degree.
- mirceal 7y agothe real question is: are you self-taught or not?
- decebalus1 7y agoI am! But even so, they won't hire me or let me provide services. I guess the medical industry also needs to be disrupted.
- aswanson 7y agoFormal bs/ms ee here as well. Started off wanting to do hardware and looked at programming as an afterthought. After a few years of working in embedded and realizing how many gaps there are in my knowledge, and how beautiful the field is, considering a doctorate in CS.
- oarabbus_ 7y agoI'm a bit confused at how you were able to be a successful developer, even if leveraging frameworks, without understanding loops?
- radicalbyte 7y ago> However, I didn't know how to write a for loop. > If you had asked me what "for...in" was, I > wouldn't have had a clue. And forget about > asking me how setTimeout has to do with > the call stack. I'm self taught, I started with the C64 in the early 80s. By the time I was 15 I was working in assembly, had an excellent knowledge of what we would now call embedded software development and a working knowledge of algorithms. I'm glad that you took the step to get a proper education. With the modern internet it's extremely easier and the quality is incomparably better than my experience of the UK educational system. Between Coursera, MIT and the vast number of excellent books it's a dream. It's an eye-opener to me that someone can be self-taught and not understand something as basic as loops. It has been my experience hiring developers that the self-taught type are considerably stronger than those who are purely college educated. I've also noticed that the self-taught type who consider themselves software engineers all went through a two year period of intense studying of computer science and software engineering in their own time. The combination of a real working understanding of software creation with passion is an extremely strong combination. What I've noticed is that your type don't get scared of technical changes because you're basically able to learn anything. The "college career" type tend to scare easily and also jump into management the second they get a sniff of it. All of this said, if I was 18 now I would strongly advise myself to do 3/4 STEM A-levels (Math, Physics and something else) and then go study Computer Science at a university which has a good program. By good program - one where I'd write a compiler from scratch, learn the theory (finite automata etc), machine learning, linear algebra and hopefully something fun like building a 3d engine or game engine or something. You can do it all yourself but a three-year program certainly makes life a lot easier, plus you get to make friends and network. AND you have a nice piece of paper.
- jw14 7y agoI'm self-taught since age 16. I've been able to write a for- loop since age 16. Maybe it helps that I'm self taught in a pre-google, pre-stackoverflow world. Any beginning programming book will teach for-loops. I do have gaps in my knowledge but if I lose internet access I can still be productive. I mostly google for how to optimize when some API is slow or remind myself some method name. I just wanted to pipe up because the top comment is "I couldn't write a for-loop" and I don't want all of us who are self taught being lobbed into that category. At my last job I regularly had to help colleagues (some who held degrees) solve issues. Strangely they had trouble starting from scratch on something new vs maintaining old code. They found the latter easier. They also sometimes chose the wrong data structures (e.g. looping through an array every time you want an item with id=x instead of just using a hashtable)
- Izkata 7y ago> (e.g. looping through an array every time you want an item with id=x instead of just using a hashtable) Huh, I had almost the exact same experience with senior devs here - they were checking if elements were in a (huge) list in nested loops, instead of using a set. Switching brought the runtime from around 2 hours to 2 minutes.
- Railsify 7y agoBut didn't you read the core docs for the language, for loops are one of the basic idioms.
- tracker1 7y agoI think a lot of people learn a given language by hacking away at something they either want to create of modify. For example, in web development, I'd say most developers haven't ever read a cover to cover book on JavaScript. I've tended to take the opposite approach, read first so I can at least grasp what I need to look for, then start applying. This of course is a mixed bag for rapidly changing/evolving tech and newer languages.
- Railsify 7y agoI take the same approach you do. When mentoring new developers I also start them off by assigning them tasks to read the docs for the core of the language we are working with.