Guide for Technical Development
google.com
google.com
If you master one of these fields, you'll be doing well. I agree on taking an intro to each of these, but only to figure out which one you want to specialize in later on and because it's nice to know something about other related fields. You won't master all of these in your career, so don't let the list intimidate you.
All in all the recommendations seem reasonably achievable in a few years of conscientious part time effort.
You don't need a CS degree because you can learn everything for free on the internet?
Also worth nothing: "an increasing proportion of people hired at Google these days don’t have college degrees."
http://www.forbes.com/sites/erikaandersen/2014/04/07/how-goo...
Same for top 10 Law schools and big Law
The capitalization of the word "university", and missing the capital H in GitHub. The "Artificial Intelligence" bullet has a formatting error. Missing articles ("work on project").
Not to mention it is vague. The "Learn other programming languages" bullet lists several options, but doesn't say anything about how unrealistic it might be to try and learn all of those languages (it says "and" instead of "or")
Meaning someone can't see passed what is in front of them (trees/treeline) to see the bigger picture (forest).
> Academic Learnings
Dead give-away.
I loathe this kind of thing. To me it evokes an image of someone who only knows computer science, and is entirely ignorant of other topics (say, history and literature) that a person needs to know to be a successful human being.
Actually, what it evokes to me is someone for whom English isn't a first language (at least not a mainstream American dialect of English) of but who has domain knowledge writing a guide in English in the domain in which they have knowledge.
It could certainly use editing, but the awkward word choice you point to isn't really something that suggests to me anything about what the person's knowledge of history and literature might be.
That said, there's actually a tremendous amount to learn on this list, and there are only so many cells to hold information. While it's always nice to say "and yes, also learn history and literature", truth is, eventually you have to not learn something in order to learn these things.
This may be a case where where the extreme rigor of the interview process and tolerance of false negatives may hurt large companies and create an opportunity for small startups and individuals. Here's why - a candidate who is very very talented at CS but also learned history and literature might come in at 90%ile, but let's say it's nearly impossible to come in higher than that without neglecting those other topics. However, the interviewers are all demanding a 95%ile+ performance. As a result, they pass on the more well rounded candidate.
It's even more insidious than this - because they select for the 95%ile, and it is very very rare to be able to achieve this feat without a single minded focus on CS, the people doing the interviewing will be at best faintly aware, and possibly completely unaware, of what they are missing.
Before getting too irritated, though, remember that any blind spot on the part of a large company is an opportunity for a small, nimble one. This is largely what is going on, I think, when you read those stories about talented programmers getting rejected by google and Facebook and coming back 5 years later to sell them a company for 100 times what their salary would have been. Of course, it's a much higher risk path that requires being broke for a while, and may just not be an option for people with other substantial life obligations.
There's this story I really liked about Andre 3000 (sorry, no link, just something I read, may be apocryphal). During an interview, he was asked how he chose the three chords for the song, and his answer was that he was learning guitar and those were the three chords he knew so far. So he took just the slightest bit of knowledge and turned into something great.
I read this at a time when I went to a music store and saw an incredible guitarist doing such impressive things with his instrument that he drew a small crowd. He wasn't just showing off, he was the local instructor. I believe he was also available for small gigs, weddings, parties, that sort of thing.
A lot of companies would pass on Andre 3000[1], and hire the awesome guitar playing dude, because Andre 3000 wouldn't be able to play a Bflat scale on demand or explain the circle of fifths or sight read a medium complexity piece of music at at least 150bpm. And I'm not knocking those skills, if you're a musician, by all means, yes, learn those things. But if that's all you focus on, to the exclusion of more creative things (and there's enough complexity that you could easily do so), you will starve other important things.
[1] prior to the hit. eventually, accomplishments do speak for themselves.
> I loathe this kind of thing
I meant "academic learnings." "Learnings" is not a word in the English language.
When I see writing that is this bad, it evokes, to me, an image of an Indian student who effectively only learned math/computer science/engineering, and does not have a sufficiently broad education to think critically and independently about anything else.
Additionally, Indian students do the best they can given the limited resources (we have). And even when they do have broad education it's not going to be about Mozart and effect of WWII on the western nations - they will always be out of context when it comes to western culture. It's the same kind of lack of ability to think (or express without getting eyebrows raised) about everything else that you might be showing here.
One of the (many) problems with this page is that it is geared towards computer science students (see header or URL). Listing 10 languages (with an "and", not an "or") may give a student the impression that he/she needs to add these 10 languages to their repertoire in order to be a successful engineer.
I'd be less critical of the page if it listed "or" instead of "and".
This is a reasonable explanation to me.
Its layout is reasonable, and it seems to have a fairly comprehensive coverage of the topic. Its not overwhelming like w3.org. I can find what I want to know with relative ease (unlike w3.org)
I have seen a couple of articles pointing out that their implementation details are bad, but I don't think I have ever gone on there with the intention of clicking "view source"
w3.org is the W3C, the actual organisation that publishes the CSS and XML specs (and the versioned snapshots of the HTML spec).
At the same time, anything I do at that level is probably going to be the exact opposite of portable: it's going to be something I intend to be specific to the exact system I'm writing for (namely, it's meant to run on a specific version of a specific Linux distribution, and possibly even to specifics of the installation on that machine). While I'm not likely to take advantage of many bash-specific features just because anything I write in shell tends to be so simple as to not need them, I'd also be an idiot to eschew useful features like arrays just because they're bash extensions.
In my experience shell scripts are fine for starting (and restarting) various programs and daemons or as thin wrappers around other apps. Beyond that I don't see the point. There's nothing other languages won't do better.
I've seen many "small bash scripts" grow up to thousands of lines, adding features one by one. And then you have to maintain that mess that catches fire every time an unexpected condition occurs because error handling in shell scripts is a joke.
That's not to say I wouldn't use it... it's actually my preference, and I've used npm for stuff that isn't strictly even node, but ymmv.
Please, stop thinking like an "expert" and put yourself in the mind of an 18 year old who is unfamiliar with all of the stuff. Yes, the author could be infinitely more pedantic, precise, and helpful for one specific career outcome (being exactly like you). This means precisely jack for a confused 18-year-old looking for guidance on what areas to spend their time learning programing topics while being medium-ly effective.
Please can the pedantic nonsense and try to focus on the goal.
The reason for it's success is declarative languages are great for data-compression. All the low level gore of reaching across the internet from one remote computer to another is reduced to a pair of <a> tags and a little text.
I know lots of brilliant people who don't write well. If Google doesn't run posts through 10 levels checkers, fine.
Excluding non-turing-complete languages is probably a bad idea technically, as perhaps one wants to promote a toolkit of appropriately-powered languages. (I've seen arguments over "HTML isn't a programming language" before, and really don't care about the of precision when it's unwarranted in the context. Concepts like mathematical functions weren't all that precise until precision was needed.)
That Turing completeness is a property of some programming languages does not imply that all programming languages are Turing complete or that Turing completeness is an essential property of computing languages. The assumption that the extents of Turing Complete languages are identical to the extents of Programming Languages requires some evidence in support.
Programming languages for describing state machines need not be Turing Complete and their implicit avoidance of the Halting Problem make them useful in practice
In terms of things to know, a programmer should know HTML to some extent in this day and age... Requiring a separate bullet point separate from "programming languages" for HTML specifically is absurd, considering the knowledge and concepts are indeed tightly related in the greater context.
The link is even broken, but this is a tiny detail.
W3School have bad reputation [1] and is considered bad.
But really, if you want to learn html+CSS, you need to spend a bunch of time just making layouts if you want to get a mental model into your head. It is just too finicky to reason about otherwise
[0]: https://developer.mozilla.org/en/docs/Web/API/MutationObserv...
1: http://meta.stackoverflow.com/questions/280478/why-not-w3sch... 2: http://meta.stackexchange.com/questions/87678/discouraging-w... 3: http://www.codecademy.com/forum_questions/4fd1d78b7e79680003...
But I still use W3S when it's the first result in google search and I am ok with it. It might not be the best learning resource but it's pretty great if you forgot some CSS property, or how some JS method is called. So W3S is fairly good as a cheat sheet.
Your connection is not private
Attackers might be trying to steal your information from www.w3schools.com (for example, passwords, messages, or credit cards). NET::ERR_CERT_COMMON_NAME_INVALID
... Scary for someone who's never seen it.
Bad form from Google -- really.
- Mostly just stuff that you learn along the way if you remotely like coding and go to an engineering school
- Doesn't talk about what to NOT spend/waste too much time on in favour of the listed things
- Doesn't list getting familiar with any version control systems. Obtuse as they may be, it's a must-learn skill for a software developer before being able to contribute to production code.
IMO, any resource like the one in the OP is going to get bashed ("not the way I would learn stuff"). Might as well learn something from it.
I don't think so. The reasons for using version control when programming solo aren't obvious. Especially with the intimidating learning curve something like git has for newcomers. Most CS students I've tutored would either dropbox their code, or store it by emailing it to themselves.
And then there's the difference between using version control just for yourself, or a small group project, vs using version control on a large application, such as OSS with hundreds of contributors. Workflows, best practices, etc.
I had never used any version control until my first internship. I didn't really put any effort into a good git workflow until I was at a company that actually cared about establishing one.
In general, school teaches you the content without the tradecraft. You'll need both to be a "rockstar" developer, and I don't see how you could ever get the tradecraft without working in the industry.
There are adequate merge tools available in VSS, like any other source control tool. Disabling them is silly.
I consider source control to BEGIN when two people check out the same file. If you can't do that, then its really version control.
If you are writing hello-world, maybe you don't need a VCS. Anything bigger than that can benefit from using one.
A few years later, I found myself working in the industry and using a real VCS (Microsoft's dont' recall the name), and realizing this was the same thing I have being doing lamely for the last two years with daily zip files and lots of notes on the README.txt for each project.
You may not "need" to, but almost any individual project will benefit from it, also.
It does mention GitHub and Kiln (Mercurial)
"Work on a small piece of a large system (codebase), read and understand existing code, track down documentation, and debug things. Notes: Github is a great way to read other people’s code or contribute to a project.
Online Resources: Github, Kiln"
Second, they did bring up version control: "Work on a small piece of a large system (codebase), read and understand existing code, track down documentation, and debug things. Notes: Github is a great way to read other people’s code or contribute to a project. Online Resources: Github, Kiln"
It's important, but not that much to be a item on this list.
If I had to pick one tip for a junior developer, I'd say slow down when it comes to adopting methodologies, techniques and use your own judgement. What's the benefit of doing? What are alternatives?
When you learn about OOP design patterns, it's easy to suddenly see them everywhere. Factory here, singleton there, and with a bit of imagination observer goes here. Not everything should fit into one pattern or another. One of the benefits of the patterns is that it might make the solution cleaner, easier to understand. If it increases the complexity - don't (or at least think more about it)!
When you learn about Agile (although nowadays it's a very ambiguous term and loads of stuff goes under this label), it's tempting to start organizing standup meetings, plan everything under sprints, assign story points, do TDD, etc. But think twice before going for it. What do you get back? Maybe the morning standups are not beneficial for the team, and just distracts everyone? Maybe story points are not worth the overhead of agreeing on, allocating them, etc and your team can do just fine without them?
If some methodology doesn't really stick to your team, maybe it's an indicator that they are totally fine without it? For example, maybe you haven't had a morning standup for a week and no one has brought it up, everything's going smoothly. Not saying that the listed methodologies are wrong, they are not, just sometimes they are not beneficial.
Same goes for a new language, a new promising framework, etc.
Be critical.
Even more worse, these sort of things come and bite people while these design schemas. After NoSQL database fashion has taken off, schema design, performance tuning et all are rapidly getting rare skills to find people with. This results in all kinds tech debt.
Much could be avoided by having good SQL skills.
You do realize most "NoSQL" databases are "Not only SQL"?
I feel that most CS curriculums could be improved by teaching more of testing and debugging. Do you know why it is not done?
I always thought this kind of skills was learned best through experience, by writing buggy code first, then fixing the bugs, then realizing that some testing could have helped to find the bug much earlier on...
Beyond that, more advanced program analysis techniques, such as model checking and abstract interpretation, use some tricky math and don't seem to be widely used outside of some niche fields (critical software).
Testing in VLSI design seems much more commonplace (people usually attribute this to the Intel bug). I don't know how much hardware design is done in a typical CS degree.
This post and the comments here seem to indicate that most people take it to mean "get an intro to xyz" (a notch above novice).
https://www.udacity.com/course/ud849
Design has become so important that it would be nice to see a lot more resources. Learning to program is relatively easy these days because of the large number of resources. Design is still a dark art.
The 'hacker attitude' is especially well summed up, imo.
A really good learning experience is having a crack at making the same app for both android and IOS (much frustration with objective c) For a newbie stuff like persistence storage, learning MVC, learning objective c, java, android and iOS, sqlite, and all the other stuff in between (Xcode is awful).
aAl of the other CS stuff is valid. Although i feel like you probably won't have the necessary buy in to learn algorithms and data structures well if you don't have a degree / GPA on the line.
It's especially depressing given their huge focus on "object oriented programming," given the 1000s of travesties birthed in its name on an hourly basis in BigCos of the world.
1) Even if you don't code FP in your day job, your sanity and code will benefit permanently from a strong grounding in it.
2) Nothing beats getting paid to code FP.
Apart from that, there's probably a reason no top 100 company uses a purely functional language as their foundation.
https://docs.google.com/spreadsheets/d/1oZ6eY7WqVNGgyRSF9F8L...
I also think this is a great point:
"Work on project outside of the classroom. Notes: Create and maintain a website, build your own server, or build a robot."
I guess this is sufficient to be an engineer at Google, but this wouldn't be close to sufficient in other industries.
What may not be that easy is the experience to make good decisions. But there is no clear path for that, except being an engineer for a sufficiently long time. This piece was targeted at students and you can't just tell them: "Keep working somewhere else for 10 years".
And note that the vs topics are also presented as not need in formal schooling to obtain.
If you follow these guidelines there is a good chance we would hire you.
Universities: make sure you are teaching students these skills if you want us to hire your students.
As a thesis statement it is wildly out of sync with all but a few of the bullet items, most of which have almost no relation to "CS fundamentals". Working on projects outside of class/work is broadly applicable to any field, as is contributing to large projects as part of a team or group; neither of these requires "CS fundamentals." OO programming and learning specific languages are likewise disconnected. Some of the points aren't bad with respect to being required in order to be a good software engineer, but even those are too scant on detail (even for a bullet list).
Most of the "learn about" points are vague. In particular, as an example, the point about DS/algorithms is awful. What does "learn about" mean? Satellite engineers "learn about" materials, orbital mechanics, radiation and E&M, but they aren't in general expected to know the fundamentals (as a physicist would understand the term) of the theories of particle physics or gravitation for example.
The bullet points read like a survey of random computing related topics. There is no focus or cohesion connecting them to being a good software engineer. It reads like somebody's random meanderings when contemplating something they might find interesting within the field of computing. It's not a guide; it's a disconnected hodgepodge.
Remove everything that isn't related to being a good engineer (that would be almost all the points about sub-discipline-specific items, like machine learning), elaborate on the DS/Algorithms points, and provide something in the guide to actually support the opening statement (good luck).
That specific enough for you?
Likewise some of Googles published API's are "in need of improvement" - which is polite civil service speak for your on a PIP
www.developingandrails.com/2015/01/crash-course-on-modern-web-development.html
Should I ignore this as a typo? How am I to rely then on this as a classified information?