Live data from Hacker News

A Cautionary Tale of Learning to Code

blog.freecodecamp.com

121–130 of 135 posts

Re: A Cautionary Tale of Learning to Code

#121
post #89

This actually mirrors my own experience a lot, except for a few differences. Biggest one being I haven't actually looked into employment yet. I too bounced between Vim and Emacs until recently I decided to stick with Emacs. I too switched to Dvorak, later switching to Colemak. I used a typing tutor software with which I was actually able to get up to a respectably 50-60 WPM if I remember correctly. However I eventual…

I have been programming for 10+ years (and really more like 15 if you count being a teenager coding), and I change languages/editors/distros all the time. I have never switched keyboard layout (this honestly to me sounds like the biggest waste of time I have ever heard of). I am just saying that its not about finding some random piece of technology that you stick with forever, 90% of the time its using the right tool…

> I have never switched keyboard layout (this honestly to me sounds like the biggest waste of time I have ever heard of).

Being someone who did that, yes I would say so and recommend against it. However one thing I can say about it is that it (Colemak to be specific) felt legitimately more comfortable, having all the most frequently pressed keys on the home row. If you're suffering from RSI it might help.

Re: A Cautionary Tale of Learning to Code

#122
post #32

Earlier quoted context omitted.

Because one finds many self-taught developers out there who can outperform college-educated compsci majors day in and day out. Because one can read universally-acknowledged figures explaining how a large number of people with a software engineering degree can't code their way out of a paper bag or pass the most basic "fizz buzz test". (1) Because we can see non-genius 17-year-olds writing apps that are bought by top…

> That is engineering, software projects with today's tools and techniques are not. This will happen some day in software. We are not there yet, by far. This statement is based on exactly the same fallacy as the featured blog post: ignorance. You are ignoring all the tools and techniques available for software engineering today: garbage collection, lexical closures, Hindley–Milner type systems, purely functional prog…

No, this statement is based on years of learning, practice and reflection, all around the creation and release of many successful software products of many kinds on the cutting edge of software development. I don't know why you assume I ignore all those things when I make my statement.

The list of techniques you provide is a hodgepodge of valuable but limited techniques, inapplicable theoretical results, and voodoo-like superstitions and rituals. They are all insightful and beautiful, but they do nothing to turn the discipline into software engineering. The day software development has turned into an engineering, you can bet the contractors who get awarded big contracts like the Obamacare web site would make sure they spend the $$$ to apply the practices which have been proven to ensure software projects become successful, they are still going to make a ton of money off the top of the contract, and that's what they do for large engineering projects for the most part. Nowadays, they are just at a loss, and try to get by, like everyone else in the industry.

GC: Apple keeps not applying it in iOS but switched to it for a lot of core OS X apps, notably Xcode 5, and switched back to assisted-referece-counting in Xcode 6 and others, since the performance degradation was noticeable. GC is great for many things but not for all. It's a trade-off.

Lexical closures: I am not sure this really makes software work better. I've seen many more well-engineered solid projects in C++ and Java, which lack them, than in javascript.

Hindley-Milner and purely functional programming: beautiful beautiful beautiful Haskell is probably the closest to practical purely functional programming system, and we have yet to see any proof that Haskell makes real software system implementation any better. Don't get me wrong, I love purely functional approaches, I designed and implemented a full custom regular expression engine with a purely functional design and implementation (even if I used C++ to write it), and it's the type of thing where the approach results in much better code in all regards. It's just still not practical for most things. I like to think about Haskell as computation poetry. It's just not practical.

MISRA-C: one entry which is just not compatible with the others. So if you are doing a project using C because it's the only practical option (controllers in vehicle engines being a paradigmatic case), it's good that there is a set of practices that, even if they make software 10x as costly, are quite good at preventing resulting deaths. I don't think this

Unit testing code coverage: another shaman practice, valuable but without providing guarantees. The space of program state is so combinatorially non-linear with regards to the space of its source code (read: entscheidungsproblem) that ensuring 100% line-wise code coverage is just a sad excuse in getting the whole building not to crumble. Better than nothing, still guaranteeing nothing.

Bug tracking systems: more good practices, guaranteeing nothing. Every single released software project I have worked on has been released with a ton of open entries in the bug tracking system. There is about as much team politics as engineering going on in a bug tracking system.

DVCS: yes, git is good and convenient, flexible collaboration, and flexible push/pull-based authority policies allow much more functional team dynamics, including fully auditable "sign-off" as part of the process. Defending this as if it provided any engineering guarantee with regards to the developed software sounds funny. Enforceable, auditable process is helpful and necessary, it ensures nothing with regards to the produced code.

Code review: frankly, this is the pinnacle of shamanism in your list. Four eyes see more than two. Eight eyes totaling 80 years of software creation experience are sure going to benefit the quality of the code. I find it indefensible this as "engineering", no matter if you include it in the commit/merge flow. It's just useful but totally fallible common sense elevated to policy.

Look, I don't shrug my shoulders, and I am not discouraging anybody from learning from past mistakes. I am saying that all the above are a nice but tiny start in the way to this field being an engineering. The difference between you and me is that I am convinced there is a set of tools and techniques which is so much qualitatively better that, once they're available, it will obvious that the current stage is more or less the stone age of software. They will provide a clear, concrete, enumerable set of guarantees about software and its production, allowing us to operate as engineers. Something which none of the entries in the above list do.

Re: A Cautionary Tale of Learning to Code

#123

Earlier quoted context omitted.

Software engineering is a relatively young field. However, to say we don't properly understand the fundamentals is absurd.

Define "understand the fundamentals". If you mean "the theoretical underpinnings", then, yes, we think we do. Turing machines and Church calculus provide solid theoretical underpinnings, that (as far as we know now) are complete. (Of course, the future could show us that they are incomplete. That's the problem with knowing whether your current understanding is proper - you don't know what gaps the future will reveal.…

I quite agree with you, but not completely. It's true that Turing & Cburch fundamentals are complete, in that anything we describe in computation can be expressed in terms of those. But I think we are using a very small subset of all Turing-Church based computing, and refinements of this understanding will provide a qualitatively better algebra for the types of software we really create. This will make it easier both for engineers to create software, and for end-users to do things that nowadays only programmers can do.

Both ends you describe (computer science and software engineering) are to me part of the same continuum. We still have articulate most of it with a coherent theory.

Re: A Cautionary Tale of Learning to Code

#124
post #21

A Cautionary Tale of Learning to Fix Teeth. My own. How a reasonably balanced individual nearly went insane I was just a guy in a suit in an office with a vague healthcare idea. Then I decided to learn to fix teeth. I overheard some guy at a happy hour bragging about how easily he was able to automate his overbite by using a technique called "4 Handed Dentristry". I thought, "huh, 4 Handed Dentistry." I went home, go…

Hypothetically speaking, if there was a way to conjure patients to practice for years the same way there's a way to download and tamper with software then yes, you could become as skillful as someone with years of practice because that's what you'd have.

Your example from hobbyist to professional has real physical constraints that are huge to overcome for an autodidact like "where do I get a constant influx of patients to practice on" and that's solved with university. Building software only has "own a computer and have internet access".

As a self-taught my reasons for not attending university are purely financial. It's basically a subtle form to gatekeep lower-class "peasants" from following their own "brain craves" for knowledge and ascend the societal ladder under the guise of a higher moral cause, specifically the appeal to the professional worth. Tough luck for you and for anyone else from your social stratum that's going away sooner than you think, regardless of how loud your barking can be.

But what is more sad is the fact that there are at this time thousands of people trying to disrupt education and yet the highest rated comment in a place that should be focused in disrupting things actually tries to grip even tighter. That's what's sad.

Re: A Cautionary Tale of Learning to Code

#125
post #122

Earlier quoted context omitted.

> That is engineering, software projects with today's tools and techniques are not. This will happen some day in software. We are not there yet, by far. This statement is based on exactly the same fallacy as the featured blog post: ignorance. You are ignoring all the tools and techniques available for software engineering today: garbage collection, lexical closures, Hindley–Milner type systems, purely functional prog…

No, this statement is based on years of learning, practice and reflection, all around the creation and release of many successful software products of many kinds on the cutting edge of software development. I don't know why you assume I ignore all those things when I make my statement. The list of techniques you provide is a hodgepodge of valuable but limited techniques, inapplicable theoretical results, and voodoo-l…

> another shaman practice, valuable but without providing guarantees

This is the same fallacious argument you keep making over and over. You dismiss tools that provide guarantees as "not practical," while calling techniques derived from experience "voodoo."

You obviously have no experience in construction or civil engineering, have never looked at a building code book, and generally have no idea what engineering is:

> The day software development has turned into an engineering, you can bet the contractors who get awarded big contracts like the Obamacare web site would make sure they spend the $$$ to apply the practices which have been proven to ensure software projects become successful

Just like Boston's Big Dig.

> MISRA-C: one entry which is just not compatible with the others. So if you are doing a project using C because it's the only practical option

No one in the real world ever has to retrofit or maintain old buildings and infrastructure projects.

> The space of program state is so combinatorially non-linear with regards to the space of its source code (read: entscheidungsproblem) that ensuring 100% line-wise code coverage is just a sad excuse in getting the whole building not to crumble. Better than nothing, still guaranteeing nothing.

Yeah, and finite element models are a perfect representation of the real world.

> Enforceable, auditable process is helpful and necessary, it ensures nothing with regards to the produced code.

I guess all those CAD data management systems don't help engineers design good buildings either.

> Code review: frankly, this is the pinnacle of shamanism in your list. Four eyes see more than two. Eight eyes totaling 80 years of software creation experience are sure going to benefit the quality of the code. I find it indefensible this as "engineering", no matter if you include it in the commit/merge flow. It's just useful but totally fallible common sense elevated to policy.

Just like structural engineering reviews of architectural plans are obviously useless. No way would a structural review by experienced engineers have helped prevent the Kansas City Regency Hotel disaster.

Re: A Cautionary Tale of Learning to Code

#126
post #104
post #83

This blog post is an insult to every developer out there. The blogger actually want us to believe that he just overheard a conversation, went home, googled what ever he said he heard and in 7 months became an expert and landed a job. So in my professional opinion, and i do get to say that as opposed to the blogger since i actually studied Computer science and been a developer for 20 YEARS, that his story is a work of…

> or the company that hired him is one of those startups that just hires anyone that walks in the door like most of them these days. Ding ding ding. You could replace startups with company though, because there are loads of companies of different ages that would hire someone with only 7 months of self study of programming. Cause the thing is that the industry is starving for software developers. Those that are not em…

And even considering all of this i highly doubt any company that pays more than 500$ a month would hire someone with 6 months of experience. That much time is not even enough to master html and css

Re: A Cautionary Tale of Learning to Code

#127
post #77
post #68

Earlier quoted context omitted.

No offence intended, I just noticed a lot of those numbers where fairly low. Like where you say dentistry is century's old which is clearly true, but "Remains from the early Harappan periods of the Indus Valley Civilization (c. 3300 BCE) show evidence of teeth having been drilled dating back 9,000 years." http://en.wikipedia.org/wiki/Dentistry So it's 90+ century's old. Which is one of those, wait what? moments for m…

That's fine. I don't know the exact details of all those disciplines, I like history, but my knowledge of it is limited. I was within reasonable orders of magnitude of the real dates, or lower, which helps my argument that software engineering is incredibly young, which is the whole point :)

The earliest known megalithic construction site is 11 thousand years old: http://en.wikipedia.org/wiki/G%C3%B6bekli_Tepe

The problem is that there has been no continuous architectural tradition. Most of the advanced Roman building methods were completely lost around the 5th century (concrete was not rediscovered until the 18th century). The Egyptians around the time of Cleopatra had no idea about the construction techniques used to build the Great Pyramid of Giza (this is why the Greeks assumed the pyramids were built by slave laborers). This is not surprising considering that Cleopatra lived closer to the first moon landing than she did to the construction of that pyramid.

Re: A Cautionary Tale of Learning to Code

#128
post #81
post #70

Earlier quoted context omitted.

> But the software is extremely robust. Does the specification specify the input as well, or is it actually robust against real input? By real input I mean stuff like HTML tag soup: There's no single standards document which describes it fully, or even mostly, and it isn't going to be fixed. Ever. It simply has to be processed, to the limits of your ability to process it. Avionics software is robust, sure, but it's a…

A fair observation. In the example of handling HTML input, I would suppose that's not a problem with individual developers, but a problem with the industry. Such a relaxed format should not have been allowed to exist, if the industry cared about its software products being as robust as possible. I'm failing to think of any avionics application that might handle HTML, but avionics systems do have their own formats to…

> Such a relaxed format should not have been allowed to exist.

Amen

Re: A Cautionary Tale of Learning to Code

#129
post #112

Earlier quoted context omitted.

The key thing about Python is that it's really plain. It's a straightforward procedural language - values, functions, names, calls, and that's about it. It has a simple object system, and some simple functional features. The whitespace business is superficially kooky, and there is a scary amount of metaprogramming and other craziness available, but people tend not to use it. As such, it's a really useful preparation…

> the special things that make JavaScript distinctive (callbacks, artisanal object systems, the interplay of JS and the DOM) If you're coming to Javascript from pretty much any other language, prototypal inheritance is probably going to be the biggest difference in paradigm to wrap your head around.

The thing is, in the JavaScript i've seen, there is no direct use of prototypal inheritance. Instead, there's some mechanism, usually involving a method called "extend" which implements something that looks like classes and instances on top of prototypes. This is what i meant by "artisanal object systems".

Re: A Cautionary Tale of Learning to Code

#130
post #77

Earlier quoted context omitted.

That's fine. I don't know the exact details of all those disciplines, I like history, but my knowledge of it is limited. I was within reasonable orders of magnitude of the real dates, or lower, which helps my argument that software engineering is incredibly young, which is the whole point :)

The earliest known megalithic construction site is 11 thousand years old: http://en.wikipedia.org/wiki/G%C3%B6bekli_Tepe The problem is that there has been no continuous architectural tradition. Most of the advanced Roman building methods were completely lost around the 5th century (concrete was not rediscovered until the 18th century). The Egyptians around the time of Cleopatra had no idea about the construction tec…

At the smaller scale. There is a continuous tradition in home construction over that time period. Further, Japan for example had an independent tradition unaffected by Rome's rise and fall.
Post reply on HN