Software Engineering Grads Lack the Skills Startups Need - <AUTHOR> https://spectrum.ieee.org/the-institute/ieee-member-news/software-engineering-grads-lack-the-skills-startups-need <comment><USER4> Isn't this just observing the fact that college isn't the same as work experience, and only provides the base skill-set needed to enter enter the industry?

"When you join a startup, there's a lot of emphasis on the design of the application, reusability and clean code, and the ability to conduct and undergo code reviews, as well as the ability to think of and build systems that can scale based on users and geography"

I can't help feel that if you're expecting a recent grad to hit the ground running with this level of insight and experience, your doing something terribly wrong. You should expect to _train and mentor_ a recent graduate, not put them in charge of a project.

* Good design requires having an insight into the requirements of a system, often with an incomplete spec and unclear long-term goals. You can't really do this without actually designing and building real-world systems, and over-time understating where the possible failure points and missing requirements may be.

* Reusability is a double edged sword, if you generalize every bit of code into a a reusable configurable component you miss deadlines and end can end up with an 'Enterprise' mess of OOP code. It takes experience to know when to generalize, and when to KISS.

* Code reviews, best practices, and requirements are different at every company and in every industry. Even someone with experience has to be brought up to speed on this when taking on a new position.

* The "ability to think of and build systems that can scale based on users and geography" ... this is incredibility specific. I work on embedded industrial systems; they're massively complicated but are single user and often only on an isolated network. Knowing how to "scale based on users and geography" is a specific requirement for this person's industry, not software engineering in general. If you want specialization, _you don 't hire a recent grad_ (unless maybe your doing research and hire a PhD).

 _Edited to expanded on a few parts._

<comment><USER5> Candidly, I would say that college does not even provide the base skill-set.

In the Real World(tm) of building software, you will work on systems built over years by other people, many of which have long since left the project or company. The level of integration tests, unit tests, documentation, and automation will depend entirely on the culture of the organization.

Databases, low-level I/O, sorting operations, and such are nominally provided either by the standard library or sourced from the community.

Infrastructure will rule your world. Good infrastructure, with smooth provisioning and deployment, will make your day a joy. Poor infrastructure, with lots of manual work and sign-offs from ten degrees of sysadmins, will do the opposite.

You will also work as a member of a team, with a wide variety in terms of background and experience levels, making clear communication, in all forms, an absolutely essential skill.

In college, very little of the above is actually covered

Sure, you'll learn lots of stuff about operating systems, algorithms, compilers, data structures, and the like. But without any real context on what that stuff really does.

But the big place that computer science education is a big let-down is on the collaboration front. There aren't many programs, perhaps none, where you are required to, as a member of a small team, maintain and modify code built three years ago by other people, and graded on your ability to produce work that can continue to be developed by future students.

Instead, the focus is on solving relatively straightforward problems as quickly as possible, with little or no attention paid to user experience, readability, testing, and any of the other things that make up the "engineering" side of the practice of building software.

<comment><USER6> Maybe make them work on open source projects?

Or even the college's own toy systems?

<comment><USER7> The problem is then their grade ends up being heavily affected by the quality of work done by other people. It'd be impossible to objectively grade such a task.

The key difference between university and work is that in the former you are supposed to receive a pretty fine-grained assessment of _your own skill_ , which is isolated and repeatable. In work, it's understood that promotion and slotting is a much more arbitrary affair and the marking criteria may not even be documented, let alone applied consistently. Also if your project fails because of bad work done by others, well, tough luck, that's what your salary is for. In university you're paying to be there, not the other way around, so the amount of random failure tolerable is much lower.

<comment><USER6> Maybe it's less about the quality of your code for this and more about how you do on: estimating your time, hitting your schedule, collaborating metrics (response time, ticket closing, etc.)?

<comment><USER7> By those metrics many of the industry's top companies and engineers would get a fail grade.

</comment></comment></comment></comment></comment></comment><comment><USER8> Colleges are not here to serve startups. Colleges are to help students build a skill set that will serve them throughout their lives. If a startup does not want to invest in a recent college grad, there are many other more experienced hires they can make.

Thinking that _free_ training which is being provided _by someone else_ should fit your custom needs is, well, maybe not the best business case.

<comment><USER9> College is free?! TIL. I guess in that case nobody can complain.

<comment><USER10> Free for the startup.

<comment><USER9> Being a college grad does not affect entry level pay?!?!? TIL

</comment></comment></comment></comment><comment><USER11> Very funny!

"When you join a startup, there's a lot of emphasis on the design of the application, reusability and clean code, and the ability to conduct and undergo code reviews, as well as the ability to think of and build systems that can scale based on users and geography"?

I don't know which startup he worked for that was doing all this and still managing to stay afloat! Startups want you to crank out features and get clients in, everything else is a failed strategy!

<comment><USER12> We do none of the above! We just keep tacking on new features to snag more clients.

On the plus side, I work 38 hours a week and not a minute more, and I get paid above median for the privilege.

<comment><USER11> We're a Series D/E company, and we still don't do all that!

</comment></comment></comment><comment><USER13> At least in my program (University of Waterloo Computer Science), there is barely any emphasis on practical things like modern tooling, different roles of a software engineer, etc., with the exception of some of the upper year courses. Instead it is largely theoretical - data structures, calculating runtimes, how the networking stack works, theory of distributed systems, etc. You learn practical things, but only enough to help you learn the theory. So yes, this absolutely doesn't prepare you for a job, but I don't think it is supposed to, it is a university program, not a bootcamp. Instead it gives you the foundation to do more research and learn practical applications of the theory you have learned.

Through internships, I feel I've learned the practical I need in order to work full time, and what I learn during internships is complimented by the theory I have learned through my degree.

So I guess what I am saying is that if you are doing a university program, you shouldn't expect it to give you the practical skills for working, that's not what it is for. Instead do lots of internships if you can, they are fantastic.

<comment><USER12> I don't know about the University of Waterloo, but at the University of Canterbury, we had separate Computer Science and Software Engineering degrees; you could get either a B.Eng (hons) in Software Engineering or a B.Sc in Computer Science.

Software engineering students had to do process and design papers, they (theoretically, at least) learned about agile development, UML diagrams, and all that other SDLC bullshit. As a computer scientist, I instead took fun papers like computer graphics and cryptography.

All the things I missed learning because I did computer science, I picked up as I needed at work. Learning how agile development works doesn't take a semester of reading books, and what you learn in theory about the SDLC at university doesn't reflect reality in any company.

</comment></comment><comment><USER14> So startups want to hire kids right out of school for entry level wages and expect them to command the skillset of a Sr. Developer... Makes sense. I too would like to hire a low cost, plentiful resource thats identical in skill level to a more experienced person while paying them less.

</comment><comment><USER15> Really? Cause it seems, based on my interviews, startups couldn't care less about my background in leading customers through beta demos, collaborating with scientists, participating in sales presentations and outreach, writing documentation, or any of the issues described here.

They do seem awful interested in whether I can find all matching subtrees in a binary tree, though. Which, now that I think about, is the one thing I learned in college but haven't done even once on the job once in 20 years (I have had to find minimum cost paths in a tree, though. I couldn't have done it on the spot at the whiteboard, but my data structures and algorithms class was helpful in researching and figuring it out years later).

<comment><USER16> The thing about all of those skills is they are all soft skills, that can be taught quickly on the job to the right candidates. Whereas a deep ability to solve a technical problem cannot be taught in a reasonable amount of time to most people.

Asking someone to find the matching subtrees in a binary tree might not be the best interview question, and to some extent it is kind of trivia for "did you grok your CS education well" \- but the point of algorithms questions overall is to see if the candidate, when confronted with a tricky problem, will solve it.

And no, these tricky problems don't come up all that often, and you're often just doing basic coding plumbing work. But the candidates who can solve these problems can do all the plumbing work too, and when confronted with a tricky problem, they can get past it. And they also may innovate in an algorithmic way where a less deeply technical developer will either get blocked or come up with a worse solution.

<comment><USER17> There is the old adage, "you can teach technical skills but you can't teach personality."

<comment><USER18> I can handle most personalities within 2 sigma, coach where I need, what is very hard to change is mindset.

People who won't try new things, because they'll suck at it.

People who don't Google (they know how, they just don't) because they think all answers all received wisdom, not something between a SWAG, an opinion, and a mental model.

People who don't read things outside their domain because that's someone else's job.

People who confuse having 1 experience for 7 years with 7 years experience.

People who think you have to be an expert scientist, engineer, architect, philosopher, and mechanic to change a light bulb, so they never even tried.

People so worried about imposter syndrome they'll never deliberately exert any curiosity for fear it will be seen as ignorance.

</comment></comment></comment></comment><comment><USER19> I think that at an even more basic level than hard skills, some graduates lack knowledge in things like basic problem solving, abstract thinking or the ability to switch between languages quickly. It's interesting to see how straight-A students who study well and test well don't make the transition from the academic environment to a job.

<comment><USER20> I have a pet theory about this.

Your whole life has goal posts laid out for you. You go to elementary school, get good grades so you can get into honors classes in middle/high school. And you do this again for college. Everything is quantitatively measured. How many questions did you get right? How many days did you attend school? How many extracurricular activities did you participate in? How many hours did you volunteer? All check boxes that other people hate laid out for you so that you can be measured in the funnel. And, artually, for some people this process can continue in their career. You get good grades in college, then you get an internship at BigCo. Then you get a job at BigCo. On and on until you die.

The problem is, you never had to figure anything out. So if you ever decide to do something non-standard or if randomness hits you too hard, or if someone along the way deems you "not good enough", now you're off the track. And you have never had to set your own goal posts. If you have to be constantly told what to do, employers are not going to want to hire you.

I think the lack of critical thinking goes hand in hand with an inability to function without rulebooks and structure.

<comment><USER19> I think this is somewhat right, but I also think that there aren't enough project based learning opportunities in school, and there certainly is not enough opportuntities to fail in school. A number of universities are implementing a limit of 3, sometimes only 2, on how many times you can fail or drop a course. So there is definetly a comply-or-die academic environment that just doen't exist in most tech jobs nowadays.

I'd love to see a curriculum where there is a class each semester that is 100% project based, where the end result isn't as important as the process.

</comment></comment></comment><comment><USER21> What's funny to me about all of these comments is that practically focused CS programs can hit the best of both worlds. There's a reason there's a direct Waterloo to Google pipeline beyond just the 4/4/4 timing. Co-op programs and practically focused programs work great for building that industry know how in a meaningful way while still getting the core CS taught better than you'd get at most if not all bootcamps.

</comment><comment><USER22> _"When you join a startup, there's a lot of emphasis on the design of the application, reusability and clean code, and the ability to conduct and undergo code reviews, as well as the ability to think of and build systems that can scale based on users and geography," he says._

I got a good, long laugh out of this. This describes the exact opposite of my experience in a startup. None of those things were ever a concern until I worked for a company that already had a revenue stream.

<comment><USER23> I mean, early stage startups fit your description, sure ... but I can't imagine many startups surviving much traction if those things don't start being looked at soon enough. Of course, some do (see twitter's Fail Whale), but I'm guessing the vast majority of startups that fail to scale ... well, they fail

<comment><USER22> There may be some confusion in my mind between companies that are only recently embarked upon a new business venture, and those who are already bringing in sufficient revenue to bootstrap further growth, but are adopting a generic "startup" branding strategy in order to shape their work culture and attract further investments.

That is, after being an indisputably young startup, the business declines to transition its identity into being a growing small business, and remains a self-described "startup" because it is secretly a _huge_ business that is still in its second or third instar, ready to moult, and to also seem like a cooler place to work than it actually is, now that the HR department has multiple permanent employees.

The emergency all-hands pivot brainstorming meeting just doesn't seem like it can even take place in the same building as all those design discussions and code reviews.

Does anyone else think that "startup" has become a branding strategy rather than a descriptive term?

</comment></comment></comment><comment><USER24> I'd much rather hire someone with a degree in computer science than a degree in AWS. I can teach them AWS.

</comment><comment><USER25> The skills startups want are taught at coding bootcamps, not universities. The degree is called computer _science_ for a reason.

<comment><USER26> Most major schools offer degrees called Software Engineering. Most Computer Science students are looking for careers in Software Engineering.

So ultimately it is called computer _science_ for the wrong reason.

<comment><USER27> > Most major schools offer degrees called Software Engineering.

name three.

<comment><USER26> Iowa State University: [http://catalog.iastate.edu/collegeofengineering/softwareengi...](http://catalog.iastate.edu/collegeofengineering/softwareengineering/)

UC Irvine: [https://www.informatics.uci.edu/undergrad/bs-software- engine...](https://www.informatics.uci.edu/undergrad/bs-software-engineering/)

Penn State: [https://behrend.psu.edu/school-of-engineering/academic- progr...](https://behrend.psu.edu/school-of-engineering/academic- programs/software-engineering/curriculum)

Those three schools are > 30k students each.

<comment><USER28> ABET lists 32 accredding software engineering programs

[http://main.abet.org/aps/Accreditedprogramsearch.aspx](http://main.abet.org/aps/Accreditedprogramsearch.aspx)

(UCI doesn't appear to be one of them.)

</comment></comment></comment></comment></comment><comment><USER29> Some highlights that I felt were very on point:

> Students are taught formal testing methods such as static analysis, which > checks code without actually running it. This helps them understand how to > test software programs, but it doesn't address the testing of distributed > systems, web services, and infrastructure resiliency. Examination of these > types of user interfaces and back-end systems is essential, Devadiga says.

This is a good observation. In my experience, the biggest hurdle new grads have to overcome is to learn to develop in a context where users and co- workers are going to depend on the projects they build, and need to be maintained. I didn't learn how to set up instrumentation, deployment pipelines, outage alerts, and other important pieces of infrastructure in keeping a web service online in my university classes.

> Because startups are heavy users of cloud computing platforms, it's assumed > that most software engineering students understand how these systems > work—but that's often not the case, Devadiga says. Students need a practical > understanding of infrastructure architecture design patterns, DevOps, and > cloud platform services like compute instances, object storage, and queueing > services. The ability to create applications that can execute in services > like Amazon Elastic Compute Cloud is important.

Another one that I think is on point. I did use AWS in a networking class, but that was just because the class instructors didn't want to deal with building dev environments for windows, mac, and linux. I didn't really get exposed to deploying and running a web application on a cloud computing platform. For how universal cloud computing is nowadays, it's surprising how little I was exposed to it in university.

I think it'd be great for universities to offer a "practical software development" class that didn't really focus too heavily on any one particular academic topic, but was more emphasized on imitating the kind of work that developers do in industry. It'd be cool students went through the whole class building, maintaining, and extending a single web service over the course of a semester or quarter. It'd be neat if grading was based not just on application functionality, but also uptime, average latency, and similar metrics - <USER2> that would probably be too variable to be fair, a student's site might go down while they're away on a sports competition or something like that.

<comment><USER30> TWO practical software development classes. One for hard skills, and one for soft skills.

The latter is another complaint I've heard from company owners. Too many graduates who just don't know how to work with a company's non-engineers, as they've told me.

<comment><USER31> You are supposed to develop the latter in university by working with your classmates on various group projects.

</comment></comment></comment><comment><USER32> I currently work at Amazon, but spent most of my career before Amazon at startups. Here are just a few things that, in my experience, this article gets wrong or over-states:

1\. "They [start-ups and next-gen tech companies] want grads who can build scalable systems and program for large-scale, distributed, data-intensive systems that leverage cloud computing." \- For start-ups, this is only true if your startup is in that space. Most "start-ups" are trying to find product market fit, and the systems are generally not large scale as a result.

2\. "Engineers at established companies mostly work within their specialty areas." \- While there's some truth to this, I think it's overstated. In the start-ups I worked with, "engineers" did not do market research. I worked with plenty of specialists at start-ups that worked with language X, but if you asked them to debug an issue in language Y, they'd refuse. In some cases, it can be the opposite of what this article states - engineers at a start-up can often focus on hands-on engineering tasks, whereas in a large company I find a larger portion of my time is around writing documents to align more people around an idea.

3\. "The timing of the product release is crucial because it has a direct impact on acquiring customers and affects the bottom line. Significant delays can put a company out of business." \- In a large company, you won't go out of business if your release is late, but it could mean that your product gets de- funded. While the change to the company might not be so much, a project getting de-funded certainly affects the daily lives of those involved. So I think this difference is overstated.

4\. "Engineers for startups are more likely to play a significant role in defining the system architecture" \- My experience is that this depends a lot on the start-up and the seniority of the engineer in question.

</comment><comment><USER33> Yeah they lack programming skills. Because they've been going to school, not programming for a living.

But they can Google. They can study for interviews that quiz you on computer science trivia.

The interview process on the coasts is broken. In the midwest I don't have to deal with that shit.

</comment><comment><USER30> This is a valid reason to consider a trade school model ("coding bootcamps") to fill this niche. Let Computer Science programs focus on the Computer "Science", while trade schools focus on fulfilling direct company needs.

Of course, we need a _ton_ more oversight involved to ensure that bootcamps are actually graduating people with a job-ready skillset.

<comment><USER34> This won't happen until the signalling that comes with hiring from [elite school] diminishes and/or the signalling that comes with hiring from [code bootcamp] surpasses it.

<comment><USER30> The signaling from [elite school] doesn't matter as much (to that applicant's competitors) if there aren't enough elite school graduates to fill positions.

A startup can hold out for MIT grads for as long as they want, but they ain't getting one if every other startup is doing the same.

_Someone_ is getting hired at the end of the day. A company that's looking to grow rapidly can't hold out forever.

<comment><USER34> I mean yes, some bootcamps have started cementing their own signal too (see Lambda) but I don't know whether that many code bootcamps will surpass [second tier schools]' signals. You are right tho that there will be a supply problem either way.

</comment></comment></comment></comment><comment><USER35> Even startups should be willing to train. The skills really aren't that hard to pick up with the right mindset and knowledge a CS grad ought to have.

We had an intern come in that was still stuck in that student-mode of needing to be told everything and not asking pointed enough questions. After a few weeks they were up to speed and productive.

Frankly even experienced workers will still require a period to absorb specific knowledge.

I think the time required for fresh grads to be productive is way, way overstated and overestimated provided they have the right direction.

<comment><USER36> They should. Often, they aren't. There are a number of reasons there - <USER3> don't have the time.

> Because startups need to bring their products to market quickly, > applications are built iteratively, with rapid prototyping. The timing of > the product release is crucial because it has a direct impact on acquiring > customers and affects the bottom line. Significant delays can put a company > out of business. While time to market is also vital for large companies, > their software releases are typically for established products, and if they > run late, such companies usually have the money to survive.

\---

Some don't have enough people to properly mentor and train a new hire.

The page for the startup of the engineer featured in the article: [https://www.linkedin.com/company/datarista/about/](https://www.linkedin.com/company/datarista/about/)

> size 2-10 employees

I would contend that any company in the 2-10 range hiring a new grad is a mistake for both particles.

\---

Some acknowledge the "they get a job, they get trained, and they go on to greener pa$ture$." In this case, the mentoring is a lost ROI in many cases.

\---

My reading of the desires of the person featured in the article... they want to hire a person at new grad wages who knows how to debug a legacy code base, architect a cloud solution, come up with new product ideas, do market research, and be a participant in the "devops means we give developers root" culture... and be able to do this within single digit number of days.

Those are things that come with experience and failure. No class or boot camp will teach those things to a point where the person is competent in them without some good time to work on those skills (side note: this is where college often produces better candidates than boot camps - they've got more time to learn the tools).

Rambling on the above... I now have a one question that will distinguish a good candidate from a poor one: "How do you set a breakpoint in your preferred debugger?"

<comment><USER35> Concede that time may be a factor, in which case, companies have little choice but to shell out real money.

> mentoring is a lost ROI in many cases.

What investment? Grads are cheap, and time to productivity as I argued isn't that long, before which they aren't merely learning. Most of the investment here is on the worker's part, and greener pastures aren't available as quickly as productivity sets in. If you're fresh out of school and working, leaving a company is unthinkable in the first year, unlikely in the 2nd.

<comment><USER36> Investment of time by other developers who could be working on the features.

This isn't saying that mentoring can't be a positive ROI - just that the person needs to stay long enough.

> If you're fresh out of school and working, leaving a company is unthinkable > in the first year, unlikely in the 2nd.

You should check out reddit /r/cscareerquestions and consider how many people advocate leaving under a year.

I will also note that for my own experience, while there are some developers who stay for a long time, there are more than a few that start and leave within a year.

In trying to get two developers that would stay on, we went through six developers. Four of which left within a year. This is for public sector and the lack monetary compensation shouldn't be a surprise to anyone... still, had four developers that we trained up and left.

The investment of time in getting them to that point where they could be useful contributors if they had stayed was more than what it would have taken the developers who mentored them to just do those tasks and not have hired anyone.

That doesn't touch on the actual pay and paperwork to hire someone.

<comment><USER35> So management decided it's cheaper to keep compensation low and have a revolving door of developers than try to retain them, or is it merely short- sightedness?

<comment><USER36> In the public sector, management has very little they can do about raises. Raises are an act of legislature or the governor. The number of people at each level within a bureau is likewise an act of legislature or governor.

Likewise, the pay isn't anything hidden either. This number is well known [https://projects.jsonline.com/database/2019/4/Wisconsin- stat...](https://projects.jsonline.com/database/2019/4/Wisconsin-state- employee-salaries-2018.html#!/grosspay18.desc.1/) (much of the technology side gets classified as IS SYSTMS DEVMNT SVCS ...). Compare those numbers to the averages for the area [https://www.payscale.com/research/US/Location=Madison- WI/Sal...](https://www.payscale.com/research/US/Location=Madison-WI/Salary)

People applying and taking the job know exactly what they are getting and going to get for compensation and benefits. Pay is a bit on the lower side, vacation is on the higher side, the pension is fully funded (actually at 102.9%).

Thus the ability to juggle things to retain a person is very limited - especially when that person hasn't been there for a full year.

Consider then, that the person is accepting the job, knowing that this is the public sector, knowing the wage history, and looking for another job elsewhere (many have left to move out west). It is not exactly practical for state government to try to match west coast compensation.

<comment><USER35> > It is not exactly practical for state government to try to match west coast > compensation.

It isn't, though there may be a sharp difference in cost of living and that's a strong consideration with wages. That, and a pension and benefits is taken for granted by younger people. Besides govt positions tending to be less exciting, you can really put some money away. Moving up, though, is a sluggish process.

</comment></comment></comment></comment></comment></comment></comment><comment><USER37> I didn't even know schools had 'Software Engineering programs. I've met plenty of Computer Science grads, though. It's truly different. Engineering is more like trade school, Computer Science is foundational.

I'll probably hire you with a CS degree, but I know I'm going to need to teach you how to be a software engineer.

<comment><USER38> Engineering is nothing like a trade school if you mean Electrical Engineering, Chemical Engineering, Mechanical Engineering... etc (probably not what you meant here by context, but I felt I should clarify).

You basically do 4 years of math and physics with several years of calculus, differential equations, numerical methods, programming, and solving difficult problems. It is nothing like a trade school (no offense to that line of work...they probably make more money than me :)).

</comment></comment><comment><USER39> It could be that schools cater to large companies' needs because they pay their employees the most and offer the highest number of jobs, and thus offer the best graduation statistics for those schools?

<comment><USER40> IME, it is because colleges, and specifically tenured college professors in CS and software engineering departments, remain woefully behind the times when it comes to relevant engineering skills.

And the latter have little motivation to stay current.

</comment></comment><comment><USER41> Alternate headline: "Startups lack the job training that new software engineering grads need"

</comment><comment><USER42> Of course. The software engineering grads lack the essential skill of willing to be paid peanuts.

<comment><USER43> More like lack of will to work on uninteresting things, they usually get more than enough peanuts to live comfortably.

<comment><USER15> They're certainly well paid enough for their land lord to live comfortably.

</comment></comment></comment><comment><USER44> Revive apprenticeships - where learner goes to master and learns directly from the one who practices the skill on a daily basis. In modern wold, this responsibility should rest on tech giants, who should have dedicated apprenticeship programs; and they should pay apprentices an honorarium for investing their time in studying their area of their, instead of their competitors.

For some reason, I don't know/understand, this responsibility got shifted to taxpayer.

</comment><comment><USER45> There is a relatively simple solution, one that's been the norm in many other industries where there are shortages of field-specific knowledge and skills - in-house training.

This may not be an option for startups but, then, maybe startups should focus on hiring more experienced professionals who can, with time, bring freshly graduated engineers up to speed, as well as helping design systems and processes tailored for the company and product.

</comment><comment><USER46> This is because most grads are one step higher than interns. They really dont know much (and shouldnt be expected to) because they lack real experience. Startups higher them because they are cheap and will work hard long hours without question. It's the trade off they are willing to accept.

<comment><USER47> VC often puts pressure to increase headcount, and unfortunately, those doing the hiring are willing to look the other way when that's the standard for accountability as opposed to productivity.

<comment><USER46> Yeah I agree, it makes sense and Im not saying its wrong either. In the atmosphere of move fast and break things its often okay to turn out bad code and fix it later once you get your hockey stick of momentum (which in some cases is perfectly acceptable). Hiring truly senior people might slow that down because they know better and want more polish or thoughtfulness put onto a product. I can see it both ways. Im not sure if Ive ever encountered a hiring manager that expect much out of a recent college grad, especially if its an undergrad. But they can learn fast and are usually eager, which is good for a startup where positivity and attitude are needed to keep moving forward.

</comment></comment></comment><comment><USER48> Edit: I wrote a whole post but now realize that software engineering is a much more conceptual master than computer science. I'll leave the following below still here since it might be interesting. I mistook the perspective though, since I talked about computer science and not software engineering.

/edit

What I'm wondering is: doesn't university prove that one is capable of learning programming/computer-related topics?

The hardest things I've learned about were:

\- rowhammer/cache sidechannel attacks via the GPU with C and then porting that to Javascript and do it over the web

\- creating a computer graphics engine from scratch (I did this in Java which made it easier)

\- reproducing a simplified version of Kevin Mitnick's attack on the Boston super computer (? not sure, memory is vague) with C, libpcap, tcpdump and other tools/libs

\- being passable at reading x86/x64 assembly and understanding how a computer is built from the architectural level to a modern programming language, playing around with creating an MUL instruction for a toy ISA

\- compilers and reading a toy ISA to then be able to read the toy machine code made for it

Is this practical? No.

Is this a lot harder than creating a new web app for a startup just starting out? Yes, if you know a programming language or two, then it's easy to hack things with JS together and also fairly easy to get up to snuff with ReactJS and ES<whatever_year_it_is> since it's mostly syntax features.

I don't have experience working with legacy systems or 1 million users large scale systems, so I can't comment on whether that's more difficult. However, since this article is about startups. I've worked for startups that existed 2+ years, and becoming productive on the job didn't take me long and I'm not an amazing programmer by any means.

My bachelor though, yea, that was a lot worse. My master in CS saved me by following security courses where the professors expected you to learn almost anything on your own.

</comment><comment><USER49> During my undergrad, I took an elective course from a visiting Professor on TDD. I found that directly relevant to work experience afterwards. That said, I wouldn't say my core CS classes were useless at all.

</comment><comment><USER50> If you learn a language in four years you can have a conversation but you're certainly not going to be fluent.

</comment><comment><USER51> My observation is that the CS degree starts making a difference about five years after young programmers start working in industry. Those without the formal background hit a wall in their technical development.

</comment><comment><USER52> It appears that startups need top level experienced people that they can pay next to nothing.

</comment><comment><USER43> This seems obvious to me since most of the jobs seem to be in web dev, maybe I'm wearing blinders but there doesn't seem to be much out there that isn't CRUD work. Computer science is almost a different field, to me its like masonry vs geology

<comment><USER53> Web dev seems to be the majority, but there is plenty of work out there in other sectors, eg. banking, finance, day trading, emergency services (my field). The jobs are out there but you have to look for them. And oftentimes they can be much more secure than a role in a startup as well.

It really depends on your skillset. I've got over 20 years experience, and honestly, I don't feel like I have the skills that most startups need either, nor the desire to forgo a decent salary in the hope that they "make it big" someday.

</comment></comment><comment> bra-ket nah, leetcode skills is all they need</comment>


Using ECMP to Access Kubernetes Services - <AUTHOR> https://medium.com/@kyralak/accessing-kubernetes-services-without-ingress-nodeport-or-loadbalancer-de6061b42d72 <comment><AUTHOR> Not sure how many people are aware that Kubernetes nodes accept traffic to ClusterIPs at the node level. This gives us a way to utilize the built-in services primitive to do load balancing, instead of relying on external load balancers.</comment>


Video showing microdroplets suspending in air - <AUTHOR> https://vimeo.com/402577241 <comment><USER2> Incredible video. I strongly recommend watching the whole thing. It changed my priors on the dynamics of micro-droplets. The part showing how a single cough can create a room-wide cloud of virus that lingers for 20+ minutes in spaces with poor circulation was especially enlightening. I won't feel paranoid for vacating an area with a sick person anymore, unless it's outside or in one of those premium buildings where you can feel the air flow.

Shouldn't the government subsidize good HVAC (not just energy efficient HVAC)? It already subsidizes green energy, which helps avert a far off semi- existential risk. Good HVAC could partially mitigate an existential risk in the near future, in addition to loss of productivity and life due to seasonal flus. Of course, we should all be wearing masks when we go out during a pandemic. Less intuitively for people, we should expect sick individuals to wear masks outside of home regardless of a pandemic, and we should never ever physically go to work or school sick.

<comment><USER3> To be fair, they were simulating an airtight room with zero movement.

Even just people walking around would create some airflow -- an HVAC would create both airflow and temperature gradient.

Blowing the droplets away is effective, but also blowing them in to either each other or a surface is also effective.

Evaporation also occurs -- the smallest droplets likely would evaporate long before this model shows them hitting the ground or dissipating.

To your final point, I direct you to the hygiene hypothesis -- you definitely want to periodically encounter low levels of non-lethal pathogens.

Yeah, people should take reasonable precautions when they are sick, and you should wash your hands whenever they're dirty or before you eat/stick your fingers in your nose (or at least 5x per day just on general principle), but we shouldn't stop having human social contact, and you shouldn't live in a Cleanroom.

<comment><USER2> Sure, we shouldn't be extra paranoid and literally live in a clean room. Yes, the simulated room had zero circulation, which is unrealistic. However, the point stands that micro-droplets linger far more than you'd think. We should find ways to systematically improve the health of the population. Guidelines to cough into our elbows just don't cut it. Flu vaccines are great but they're not enough and they're not universal.

My logic for subsidizing good HVAC also applies to other pathogen mitigation technologies. No-touch sinks in public areas are one example.

</comment></comment></comment><comment><USER4> I am really struggling to understand the recommendations for SARS-COV2 at this point.

WHO claims that the virus is transmitted via contact or heavy droplets and some other study previously linked on HN refered that aerosolization was only a risk in ICU when extubating a patient.

But this video seems to contradict that, no?

<comment><USER5> The professor only said that "they're now becoming aware of the possibility of the virus being transmitted via droplets". So they're not totally sure either. It's all at an early exploratory phase.

</comment></comment><comment><USER6> The 1.5m distancing rule that so many governments (and sadly once more their lackey scientific experts) has very little to do with physical properties, but is chosen so as to allow for the least possible required adaptations to factories and offices.

<comment><USER7> The video shows both real sensors and a simulation showing the vast majority of particles contained in a 6-ft range and then falling to the ground.

<comment><USER6> Your observations are correct, but your implied conclusion is not.

In the 'real' environment micro-droplets are shown to be suspended for minutes. It is the larger droplets that are pulled down by gravity and do not make it far. But the micro droplets can contain more than enough virus particles.

It is shown that the room gradually accumulates more and more suspended droplets as people continuously produce them, not just through sneezing and coughing, but just by talking and breathing.

In a typical office environment there is continuous low velocity air circulation spreading these droplets through the room and saturating the whole space with them.

The video shows also that cross drafts, which produce a high air replacement, can take the droplets outside of the room which is a good thing. The moment the draft is closed the accumulation starts anew.

</comment></comment></comment><comment><USER8> Their model doesn't seem to account for static charges and evaporation, which typically results in accumulation on surfaces and less of endlessly freefloating in a room.

<comment><USER2> Isn't that almost as bad? That means that if you don't breath them in, they'll have another chance of infecting you through surface contact and inevitable migration toward your face.

<comment><USER7> Not if you don't rub the walls, ceiling, and floor.

<comment><USER2> What about the other things that could be in a room? Tables, couches, food, etc...</comment></comment></comment></comment>


Amazon SimpleDB Goes Beta - <AUTHOR> http://www.informationweek.com/software/showArticle.jhtml?articleID=204803008&subSection=Enterprise+Applications Scalable database as a service.<p>My previous employer Powerset was an early tester, good to see it finally out in the world. <comment><USER2> This is cute, but doesn't really do anything which isn't already possible with EC2 and S3. The most critical limitation of EC2 and S3, at least where databases are concerned, is the "eventual consistency" model: If you store data, you'll _eventually_ be able to get it back -- but there are no guarantees as to when.

When I heard rumours that Amazon was going to be launching a database service, I hoped that it would solve this problem; instead, it seems that Amazon has released the world's first "database" which not only transactions, but even lacks consistency!

<comment><USER3> "This is cute, but doesn't really do anything which isn't already possible with EC2 and S3."

EC2 doesn't give you durability, and S3 doesn't give you speed. SimpleDB gives you both.

<comment><USER4> It sounds like SimpleDB runs on EC2, meaning it can't do anything that you couldn't build yourself on EC2. If you replicate data across enough EC2 nodes you can get durability (at the cost of complexity and high MTTR).

</comment></comment></comment><comment><USER5> I like the focus on simplicity, but I'm not excited about writing a custom framework to handle the new proprietary query language. I was hopeful a service like this would accept standard SQL but this is not the case.

Eventual Consistency will require a complete re-thinking of how traditional web apps persist data. This is a big problem. I'm just hopeful that it will eventually be possible to guarantee that written data is immediately accessible. Maybe by briefly buffering it in an external location until the SimpleDB data is consistent? Yet more custom framework code to write..

<comment><USER6> Don't forget the part where your brand-new custom framework needs to properly serialize and deserialize each value based on its type. Because according to this person: <http://www.satine.org/archives/2007/12/13/amazon-simpledb/>

...Amazon's magical indexing technology is to make all searches lexicographical. So you have to "zero-pad your integers, add positive offsets to negative integer sets, and convert dates into something like ISO 8601". Or something.

But at least you don't have to write one of those fiendishly difficult CREATE TABLE statements! Ah, "simplicity"!

</comment></comment><comment><USER7> <http://www.satine.org/archives/2007/12/13/amazon-simpledb/>

<comment><USER8> I wrote up an overview post at [http://www.sriramkrishnan.com/blog/2007/12/amazon- simpledb-t...](http://www.sriramkrishnan.com/blog/2007/12/amazon-simpledb- technical-overview.html)

The eventual consistency part is going to be interesting to watch.

</comment></comment><comment><USER9> No joins!

I guess you have to take denormalization to heart!

<comment><USER10> really!

somewhat disappointing but I suppose there's a reason for this

</comment></comment><comment><USER11> This is great news. We have just started using EC2 and S3 for a startup I've invested in and one of our concerns has been using mysql as it needs to be used on an EC2 instance. We've been looking at ways to ensure our data is safe, but this SimpleDB could provide the answer we've been looking for. Hope I get into the beta! Out of interest, anyone else out there using mysql on EC2 and how have you dealt with ensuring your data is safe?

</comment><comment><USER12> The last line:

> There's one significant cost that SimpleDB users can avoid: keeping a > database administrator on the payroll.

cringe cringe cringe.

<comment><USER13> No, all it may do is change the DBA skill set a little. If your data wasn't important enough for a DBA then you wouldn't have had a DBA anyways and SimpleDB does nothing to change that.

Conversely, if your data matters enough to you then there will be a DBA somewhere who knows the data well enough to ensure it survives.

Who are you going to call when your application corrupts your data? Amazon probably won't lose your data on purpose but they can't prevent mistakes.

However, this could be an opportunity for an startup - outsourced SimpleDB data administration.

<comment><USER12> Good points and all but the cringing was for the cliched way the article ended.

</comment></comment></comment><comment><USER14> <http://www.amazon.com/gp/browse.html?node=342335011>

</comment><comment><USER15> SimpleDB appears to be Amazon's Dynamo opened up as a web service. There's good technical information, including a paper, over here: <http://allthingsdistributed.com/2007/10/amazons_dynamo.html>

<comment><USER16> ARRGH! Did no one actually read that paper? Its 1MB limit on data size and concentration on HA for writes makes it unsuitable for this purpose, just as it is unsuitable for S3 (a previous rumor purported by the commenters on this site). RTFP, people!

<comment><USER15> max 256 attribute-values per item. Max 1024 bytes per attribute value.

</comment></comment></comment><comment><USER17> I was interested until I read this: "Query execution time is currently limited to 5 seconds."

</comment><comment><USER18> mmmm costs $1226.4 just to run without datacost being accounted for.

I love the idea but I feel the pricing should of been like s3 I.E just paying for storage and bandwidth.

I can't see how you would get out a key from the system when you add a new record...

<comment><USER19> That $0.14/hour is the amount of processing you do, not the hourly cost to use the service.

$1226.4 is if you're hammering the data-base with intense queries 100% of the time (so it's always being utilised).

In reality (though this depends on how efficient their database is) it'll likely be orders of magnitude smaller.

<comment><USER20> So $.14/hour is for a full unit of processing for an hour? What's the smallest amount of processing you can get?

<comment><USER19> "SimpleDB costs 14 cents per machine hour, with no minimum fee."

I guess we won't know the costs in reality until the service is up. It pretty much all depends on how efficient their implementation is.

<comment><USER18> so if you get one hit to the db per hour then you are going to end up paying for it big time.

<comment><USER19> How exactly?

If a query takes 1ms, you're going to pay for one sixty-thousanth of $0.14 . I fail to see what you're doing? Or am I missing something?

<comment><USER18> I thought it was charged like this, if you use it once then the minimum amount you will be charged is for an hours usage per hour.

but it could end up really expensive if you are hitting your database a lot. 100k users hitting a 2 second query per view ain't going to be cheap.

<comment><USER21> No.

 _Machine Utilization - $0.14 per Amazon SimpleDB Machine Hour consumed

Amazon SimpleDB measures the machine utilization of each request and charges based on the amount of machine capacity used to complete the particular request (QUERY, GET, PUT, etc.), normalized to the hourly capacity of a circa 2007 1.7 GHz Xeon processor._</comment></comment></comment></comment></comment></comment></comment></comment>


100 Startups Selected to Comprise Third Generation - <AUTHOR> http://www.startupchile.org/100-startups-selected-to-comprise-third-generation/ <comment><USER2> How does Startup Chile facilitate the injection of capital necessary to continue product development past the seed stage? Are there networks of angels, super angels and VCs ready to invest in companies as per YC?

Also, is the $40K per founder or per company? I understand living costs are much cheaper in Chile, but how long can two founders live comfortably in Chile with $40K?

Any insight would be greatly appreciated.

<comment><USER3> What about all the social unrest currently going on in Chile?

I don't know a lot about the situation other than passing mentions in the news but the protests were a big enough deal to warrant a wiki page.

<http://en.wikipedia.org/wiki/2011_Chilean_protests>

<comment><USER4> They probably say the same about America. "What's with all that Occupy Wall Street social unrest?"

I was in Ecuador when the FARC "incident" happened a few years ago. My girlfriend saw the news and canceled her trip to see me despite my reassurances. Quit watching the news and travel.

<comment><USER3> Well I've been to Ecuador and your GF probably didn't miss anything that great lol.

But seriously Chile doesn't really have the best historical precedent... Plus the countries politics are firmly grounded in socialist ideals and don't forget about the large magnitude earthquakes it suffers through regularly.

<comment><USER5> If you think like that, then you shouldn't go to California either, same earthquake problem and the state is broke.

Chile is a very stable country, equal or less corruption than the US, and the best economy in south america. Not to mention really beautiful and great weather.

You should stop worrying so much and start enjoying life a bit more.

</comment></comment></comment></comment></comment><comment><USER4> How are the first two generations doing?

</comment><comment><USER6> I applied but didn't make it this time. I will be sure to apply again :)

</comment><comment><USER7> My startup was one of the ones selected. We've just got a temporary website up here: <http://myster.io>

We're a group of three nomads making software from around the word. In addition to the $40k grant, one of the big benefits for us of Startup Chile is a guaranteed 1 year visa to live in Chile! (The biggest challenge to working while traveling is having to change countries every 90 days or so.)

We're building something we're calling a "discovery engine". Its like a search engine, and like search engines it tries to find good quality results to queries, but instead of indexing web pages we are indexing the App Store.

<comment><USER8> Congrats on getting selected!

One tip: you may want to consider a tagline other than "discovery engine". It's already overloaded. For example, Microsoft originally marketed Bing as a 'discovery engine' and see also:

<http://www.crunchbase.com/company/discovery-engine>

<http://www.intelligenx.com/local-search/discovery-engine>

<comment><USER7> Good point. The sad thing is, we were pretty happy to stumble into that phrase. Didn't' realize Microsoft had used it. We don't want to use the term "search engine" because that implies textual queries and text matching. Whenever you're doing something new, you need a new way to describe it, and we're going to have to figure out the right positioning and right way of describing it. Hopefully without confusing people.

</comment></comment></comment><comment><USER7> Anyone have questions about the project? The application process? I obviously have no experience of the program itself, but will share our experiences with applying for anyone whose considering it.</comment>


Modern C++ Features – std::optional - <AUTHOR> https://arne-mertz.de/2018/06/modern-c-features-stdoptional/ <comment><USER2> The worst part about this is that Apple has decided to once again violate the standard. They purposefully eliminated the `value()` accessor due to ABI issues as far as I understand from the stack overflow comments: [https://stackoverflow.com/questions/44217316/how-do-i-use- st...](https://stackoverflow.com/questions/44217316/how-do-i-use-stdoptional- in-c)

My recommendation would be to just use [https://github.com/martinmoene/optional- lite](https://github.com/martinmoene/optional-lite) for cross-platform stuff.

<comment><USER3> "Violate the standard" might be a bit harsh. The fact that you are using <experimental/optional> instead of <optional> as your header should indicate that something else is going on.

Practically speaking, it takes a while for features implemented upstream to make it into your OS of choice. If these are really critical features, you can get third-party implementations of <optional> or you can compile your own toolchain, neither of these are particularly difficult options. It can be a bit frustrating, yes, when language feature arrives on a different schedule in the library and compiler (which happens).

Mind you, #include <optional> doesn't work on my Linux box either, with GCC. And if you look at the GCC web page, [https://gcc.gnu.org/projects/cxx- status.html#cxx17](https://gcc.gnu.org/projects/cxx-status.html#cxx17), it says that GCC's support for C++17 is "experimental". I know that GCC != Clang, but let's give them some time to test things before a million projects get the code compiled in and we're stuck with the implementation.

<comment><USER2> GCC moved it to <optional> with the release of GCC7. Note that we're now at GCC8, clang 4 added it - I believe we're now at clang 6.

Therefore, it's by far no longer something that's experimental IMHO. (standardised in C++17 after all)

</comment></comment></comment><comment><USER4> A possible std::optional footgun is that an optional object can implicitly be converted to bool, returning optional has_value(). For optional objects that may hold value types that themselves can be used in a boolean context (like bool or a pointer value), then a programmer may confuse the implicit has_value() check with returning the real value().

      std::optional<bool> opt(false);
      assert(opt); // true even though *opt is false!

[http://en.cppreference.com/w/cpp/utility/optional](http://en.cppreference.com/w/cpp/utility/optional)

<comment><USER5> An optional containing a pointer seems pretty dubious. You would usually either just use a pointer and have null mean empty or use an optional containing the pointed-to type.

An optional pointer is a weird tri state thing where you can have empty or a null pointer or a non-null pointer.

<comment><USER6> Semantically though, not having a pointer value and having a value - even null - are two different things. For example, doing pointer arithmetic in the former case would be meaningless.

<comment><USER7> Null pointer arithmetic is undefined, so just as pointless as arithmetic on an empty optional pointer. Your example fails to prove that optional pointer has any valid use.

<comment><USER6> Sure, my point might seem theoretical; to explain further, the difference is that when std::optional pointer is used correctly its behavior in the absence of a value is perfectly defined! Which is a good thing.

</comment></comment></comment></comment></comment><comment><USER8> _The pointer dereferencing operators_ and -> are implemented, but without the std::bad_optional_access – accessing an empty std::optional this way is undefined behavior.*

Oh, please. Raise an exception or panic. But "undefined behavior" on dereferencing this new form of "null"? That's no good.

<comment><USER3> Edit: Rewritten.

You say, "Oh, please." But this feature is consistent with the design mandate of the C++ language... the very foundation of its design is that you don't pay for safety if you don't want to. So I am not sure what you are trying to say.

Honestly... why aren't you just using a different language? Practically every other language invented in the past 30 years has the safety features it sounds like you want. So, why come into a discussion about some new C++ feature and complain about the fact that a safety feature is optional? This is the way it always has been for C++. This is the way pointer dereferencing works for all the new smart pointers. Dereferencing std::shared_ptr and std::unique_ptr... both unsafe, equally unsafe as std::optional. This is the way std::vector works. They're all unsafe unless you specifically use certain safer accessors like .at(). The fact that dereferencing a std::optional is unsafe is consistent with decades of changes to C++.

<comment><USER9> Let's keep things civil please. Saying "I can only imagine that you're trying to start a fight" is rarely helpful.

<comment><USER3> Okay, rewritten. I honestly thought the parent comment was baiting, since complaining about C++ safety is... well, rarely helpful and usually just starts arguments.

<comment><USER9> Thank you for the rewrite, much appreciated.

If I may offer a tip, when someone takes a position that seems unreasonable or baiting or argument-prone, I try to apply the principle of charity: I assume that their intentions are good.

Of course I don't always succeed at this! ;-)

<comment><USER3> Sometimes the principle of charity is quite harsh, because in some cases if you assume that someone has good intentions, you come across as condescending and make it sound like you think they're ignorant. So I don't think that the principle of charity is always the right approach. The tone of the original comment starting with "Oh please" doesn't incline me towards a charitable interpretation, and it still doesn't.

<comment><USER9> You are certainly right about that. Perhaps this is where it becomes an art instead of a science. How can we create a positive conversation that we can all learn from, even when people say such obviously provocative things as "Oh please"?

If someone takes that kind of attitude, so what? You'll never lose by taking the high road; I've found it to be a very rewarding exercise to try to be chill regardless. Of course as I mentioned, I don't always succeed.

At least I _try_ to be like the old Shadio Rack:

"You've got answers? We've got questions."

<comment><USER3> Emphatically disagree. You can lose by taking the high road, because it costs time and energy. Being chill regardless is an unhealthy habit, I've found it better to allow myself to feel whatever I happen to be feeling (mindfulness), and share my feelings with others when appropriate. This will inevitably be "not chill" from time to time but it's healthier.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> Been using boost for this (what else is new?):

[https://theboostcpplibraries.com/boost.optional](https://theboostcpplibraries.com/boost.optional)

[https://stackoverflow.com/questions/22227839/how-to-use- boos...](https://stackoverflow.com/questions/22227839/how-to-use- boostoptional)

<comment><USER11> constexpr I think is the big difference. Also the name of the empty class to reset the value to none, boost is boost::none whereas the std has std::nullopt_t. I prefer the boost name of none as nullopt sounds and looks too much like null.

</comment></comment><comment><USER12> With all the modern features being used, I wonder how one would go about learning modern C++.

<comment><USER6> If you know the basics, cppreference.com is your best bet.

<comment><USER13> And reading real code. It's important to see how these pieces all go together. Just reading cppreference is like familiarizing yourself with legos without seeing how to build something with them.

</comment></comment></comment><comment><USER14> Can't you still return null from a function? So even if your return type was optional, you'd have to check if it was null in some cases before unwrapping it.

(Edit: Limited c++ experience, thanks for explaining)

<comment><USER15> No. In Java every object variable is a reference type. They're all implicitly pointers. Hence why all objects can be null. Java just hides all the dereferencing away. "Object myobject;" creates a pointer/reference rather than an actual object.

In C++ you can have pointers to objects, but they're explicitly denoted by an asterisk. The C++ equivalent would be "Object* myobject;"

However, you can also directly have object variables in C++. That's not something that exists in Java. A variable declared like, "Object myobject;" can never be null. The myobject variable is a value, just like i in "int i = 5;" is a value.

<comment><USER16> To expand on this:

In C++ a useful heuristic could be to think of values like Java primitives.

A C++ integer takes up some amount of space. Maybe it's four bytes on your platform. Integers on your platform take up four bytes. Not "four bytes plus a pointer", but four bytes and that's it.

In those four bytes you can store 2^32 values. There's nowhere else to store whether the integer is null -- if you wanted to signal to someone that the value was "missing", you would either have to,

\- Come up with your own "in-band" signal, like "-(2^31) means 'missing'", or

\- Have an out-of-band signal, like a separate boolean variable, or keep a pointer to "integer or null". (Pointers being nullable is arguably kinda weird still.)

Functions that return an integer in C++ on your platform will put four bytes "in the right place" on the stack. (Or in a register? I don't really know what calling conventions look like...)

Again, there's nowhere to signal that the value is missing -- if you don't fill in that memory location or that register, well, there will just be some other (undefined) value sitting in its place that the caller will read. Ditto functions that expect integer arguments etc.

Now, this has some interesting consequences: for stack-allocated values in C++, "object identity" tends to be preserved less often than in Java. When you put an object into a `vector`, you'll probably put a copy there. When you mutate that copy or call some function on it, you're not mutating the original. You can get back to "Java semantics" of object identity and nullability etc by using pointers and explicit heap storage.

<comment><USER17> > Functions that return an integer in C++ on your platform will put four bytes > "in the right place" on the stack. (Or in a register? I don't really know > what calling conventions look like...)

On a register. I don't know of any mainstream platforms which return simple values like an integer through the stack.

For larger values (larger than a word or a couple of words), on the other hand, usually the calling function passes the called function a pointer to a location on the stack where it should write the result.

Either way, like you said "there's nowhere to signal that the value is missing".

<comment><USER18> Nitpicky detail: a lot of the time, the pointer variable passed to be written to is not on the stack, e.g. using strcpy with a malloc'd buffer.

<comment><USER19> I believe he is taking about the native retuning semantics, which is in a real register for simple types or organised to be on the stack by the caller or register frame for a larger value type. Point being, it's a compact primitive reflection of the machine, not much more.

</comment></comment></comment></comment></comment></comment><comment><USER20> I wonder if at some point there will be cpp that's kinda like kotlin to java. Source code compatible but a clean cut.

</comment><comment><USER21> I find this useful for older paradigms where you want an error as well as pass in something to fill in as the output. Instead of doing bool foo(OutFoo* out_foo) or overloading Id getId(); // returns -1 if not present. You could use base::Optional<OutFoo> / base::Optional<Id> in each case respectively.

<comment><USER3> You may find std::variant also very useful. You can do something like std::variant<Error, Foo>.

</comment></comment><comment><USER22> Optional is a typical feature that should be baked into the syntax. If used properly, it will be used throughout codebases, and when it is used, it adds simple, replaceable syntax.

<comment><USER23> I disagree. If a perfectly good optional type can be implemented without making new syntax, why bother making new syntax? It obscures what's going on under the hood, makes implementation needlessly complex, and increases mental overhead for users.

<comment><USER6> To be fair, not all languages make this easy.

</comment></comment></comment><comment><USER24> > In programming, we often come across the situation that there is not always > a concrete value for something

In database terms, the need for null values means that the data schema is denormalized. With a simpler approach there is seldom any need for these "not applicable" values.

And that's the problem with all languages with special support for "nullable" values: They glorify bad data structure design. I've seen codebases where 30-50% of the lines is just handling of null values that SHOULD NOT BE THERE and where nothing meaningful (or even functional) happens when the value is actually null.

Goes well together with OOP: In the name of isolation, each object is abstracted from all context necessary to construct a straightforward and correct program. The result is more and more meaningless boilerplate and burnt out developers.

Personally I'm fine with not assigning any value to "not applicable" variables. Or putting a sentinel there, like -1 or NULL. But adding a physical case (i.e. changing the type) to support "not applicable" cases is just not a good idea.

<comment><USER25> > In database terms, the need for null values means that the data schema is > denormalized.

And nobody ever use a fully normalized schema in practice, because it's cumbersome and gets in the way of solving the problem.

And that's for databases, that are optimized stable storage and data coherence, not for performance. A fully normalized schema is a performance disaster if applied to running applications.

<comment><USER19> This is not really true of any mature system. There are many reasons to design a schema in normal form, including performance, maintainability and space optimisation. Database design outside start-ups is a fairly mature area and normal form is well proven good practice.

<comment><USER26> In our application we have a form that has at least 50 fields which are individually optional. This is in addition to the required fields, and currently it's all one table.

Are you saying it would be better for performance and space to have all of those optional fields in separate tables, and that it wouldn't be a huge PITA to write queries against for say reporting and while debugging?

<comment><USER24> Are these 50 fields "logically" relevant? In other words, do you do significant joining at these fields? Or in business logic, do you switch much on the presence of these fields?

I'll assume "no" since they're so many of them and they're individually optional fields. Maybe most of them are strings and you could simply use empty strings. Or whatever, it doesn't matter. I'm not saying these cases are trivial, but they're leaf concerns and not really relevant from a "schema" point of view.

But if the answer is really "yes", then I'll say that's at least a maintainability problem (bad coherence).

<comment><USER26> They're fields in a digitized form, essentially. Multiple name, address etc sections representing people or companies, for example, as well as domain specific fields which shouldn't be used, are optional or are required depending on the value of a previous field. Most are strings of various lengths, but also plenty of numeric (weight etc) fields as well as dates. Expected arrival date for example, which is optional in most cases but required in some.

Our UI would have to join in all the fields, as it displays them all in one window, and our customers would absolutely hate to split filling them up into multiple windows.

Also, once the form is sent and approved by officials, the data has to be saved without change for 10 years, like saving the paper version of the form for 10 years in a filing cabinet. It also needs to be easily accessible for the users up to 3 years after approval in case one needs to make a correction, which is essentially done using a special copy of the form.

I'm no db expert by any stretch, I've learned by doing. So not gonna claim this couldn't have been handled better.

<comment><USER26> To expand slightly. Take one of the name and address sets. If the company has a valid EORI number, one should _only_ fill in the EORI number in the organization number field (filling in name etc would lead to error). Otherwise one should supply name, address, country etc. Depending on the value of another field, the name of a contact person is required, otherwise it's optional.

<comment><USER24> I think these kinds of constraints are much easier implemented as code in a business logic layer. Conventional database schemas with their limited expressiveness are probably not well suited here.

<comment><USER26> Sure, but that wasn't really the issue. The issue was how to store such data in an optimal way.</comment></comment></comment></comment></comment></comment></comment></comment></comment>


To live forever, break habits - <AUTHOR> http://www.npr.org/blogs/13.7/2010/09/29/130221453/how-to-live-forever-or-why-habits-are-a-curse <comment><USER3> Interesting article. I liked it.

I think you could take his basic premise - "staying out of a routine and breaking habits makes life feel longer and time pass slower" - and expand on it to also achieve more worthwhile pursuits.

Instead of changing habits randomly, instead aim to always be at the threshold of your competence.

I've spent a few years looking into this, and the best thing I found for myself is aiming to always be at a 70% success rate on my daily, weekly, and monthly goals/targets. If I'm succeeding higher than 70%, I increase the difficulty level or add new challenges. If I'm below 70%, I scale back and pare down until I get to the essentials.

It's good, because I'm succeeding more often than not, but I'm always at the threshold of my competence. I think a lot of people set goals too low to get to 100%, or they get discouraged when they fall short of ambitious goals.

Me, falling a bit short is part of my life, so I'm always pushing and expanding, failure is part of my life and gets easier over time, and there's always new things. I'm about to add a new set of targets - either I'm going to start doing bodyweight exercises and set some fitness goals, or I'm going to take up drawing and make more art. Or both? I'm doing this to replace "surfing the internet" with either drawing/painting or bodyweight exercises/balance/martial arts as entertainment time. Thus, life stays fresh, new, exciting. And whatever my goals are for strength training or art, I'll be falling a bit short of them - which is to be expected and embraced, always on the edge and threshold of my capability. But still, a 70% success rate, which is encouraging and I'm succeeding more often than not. Wholly recommended if you haven't tried setting goals and targets this way - if anyone has questions on setting something like this up, feel free to drop me an email, I try to make myself pretty freely available to people working on achieving things.

<comment><USER4> Seems like an interesting idea to push into an education system.

This is concept behind harder versions of classes (e.g. honors, AP) where you can increase the difficulty level if you have shown you are capable. However, the timeline is too long. Perhaps content tracks that included advanced reading/homework assignments and exams could be used to keep students engaged.

Would embedding game-like achievements (next track unlocked, toughest unlocked, stump/teach the teacher etc.) be of benefit here or just a distraction?

Has anyone had experience with teachers/professors that use these concepts?

<comment><USER3> Good comment, yes, I've looked into this too. If you look at game design, incremental variable rewards are one of the most addictive possible things. Incremental means you unlock them gradually, and variable means you don't always get the same thing. That's why getting an awesome item in Diablo II was always more addictive than getting an awesome item in Baldur's Gate. In Diablo, you never knew what you were going to get and how valuable it'd be. In Baldur's Gate, the Hammer +3 was always with this guy, the dagger +2 was always buried down in the southeast tomb, etc.

Mixing variable and incremental rewards does increase addiction, which can be positive or negative. It's positive if you're harnessing it.

I think this could definitely work for teaching people things - one of the ways I learned how to type really fast was playing a text-based player vs. player game way back in the day. Getting semi-unrelated rewards (like you said next track, toughest unlocked, stump the teacher, or more commonly badges, ranks, points, etc) can be a massive boon to learning something. There's also the "head fake" element of teaching while not looking like you're teaching, which I got from Randy Pausch's Last Lecture (highly, highly recommended if you haven't seen it).

With all that said, I haven't found quite the right way to harness it in my own life. A lot of the tracking I do gives me a way to get numbers and feel good, but assigning myself badges or points seemed like a little more trouble than it's worth. Just setup and maintenance time of that systems seems like it wouldn't be worth it, but if someone else built a good one, I'd use it.

I've played with various software that tracks goals/habits/etc, but I keep coming back to minimalist, flexible stuff, that lets me do what I want with it. But I think sooner or later someone will build something that works well for either general education or other skills training, and I'd be all over that.

<comment><USER4> This video on Khan Academy's "Vision and Social Return" (<http://www.youtube.com/watch?v=wRf6XiEZ_Y8>) seems to be putting some of this into practice (requirement of 10 in a row with visual feedback). Also the feedback for the teacher (in terms of attention span and student proficiency) is amazing--it has to spread.

</comment></comment></comment></comment><comment><USER5> I've always liked §295 of The Gay Science where Nietzsche makes the distinction between "brief" and "enduring" habits:

"I love brief habits and consider them an inestimable means for getting to know _many_ things and states, down to the bottom of their sweetness and bitternesses...

 _Enduring_ habits I hate, and I feel as if a tyrant had come near me and as if the air I breathe had thickened when events take such a turn that it appears that they will inevitably give rise to enduring habits...

Most intolerable, to be sure, and the terrible par excellence would be for me a life entirely devoid of habits, a life that would demand perpetual improvisation. That would be my exile and my Siberia."

([http://clichereality.blogspot.com/2009/07/philosopher-as- tra...](http://clichereality.blogspot.com/2009/07/philosopher-as-traveler- nietzsche.html))

<comment><USER6> I like that idea, habits as the basis of improvisation, and visa versa.

But, I believe it does pay to have some constants in life. Perhaps not a habit per se, but common theme to habits.

</comment></comment><comment><USER7> I would boil it down to this, keep learning new things all the time, whether it is a new language, taking pottery classes, learning a musical instrument, a piece of technology, gardening etc while keeping what is working intact. This is important. You need a solid base and comfort from where you can enjoy the learning.

The author went overboard with his cigarette and marriage suggestions.

<comment><USER8> "And a habit-free existence — as I wrote last week — isn't really possible anyway. It would be an existence without expertise, and so a life without language or meaning."

I don't believe he's actually suggesting you get rid of all your habits (i.e. wife). He was just stating that habits make time pass quickly, and getting rid of them slows things down. But that doesn't mean we should get rid of them... just that we should realize and accept the tradeoff.

</comment></comment><comment><USER9> Sorry for being patronizing, but I went through a phase like this too: figured out that human life is dominated by habits, decided this was "the" problem, and resolved to live anti-habitually. It didn't work. I think the reason is human nature: we're creatures of habit. Not to have them would be not to be human.

Habits _can_ supplant other habits, but even that is not subject to direct conscious control. There's an entire self-help literature around it, some of which is good, but it's easy to take it the wrong way and go down a superficial path.

</comment><comment><USER10> My personal hypothesis is time is perceived to move more quickly the older you get because an hour, a day, a minute become smaller fractions of the time you've been alive.

EX: When you're 10, a year is 1/10th of your life, but when you're 60 it's only 1/60th. The magnitude of an additional year of life at 60 does not feel as great as it does when you're 10.

</comment><comment><USER11> Perhaps it was tongue-in-cheek, but I'm not sure the "leave your marriage" advice has any backing whatsoever; in fact, it would appear to be quite the opposite effect on one's lifespan:

<http://news.bbc.co.uk/2/hi/health/4779267.stm>

"Those who had been widowed were almost 40% more likely to die, and those who had been divorced or separated were 27% more likely to die. "

Overall, the article felt light on facts - even the title is even fairly linkbaity (live forever!). For an article on increased lifespan (with citations instead of hand-waving), this article is much better:

<http://wiki.masterlifefaster.com/Home/long-life>

<comment><USER12> _... those who had been divorced or separated were 27% more likely to die..._

Than who? Would the people that died after a divorce have survived if they had stayed with their poisonous spouses? I doubt it.

<comment><USER11> That's an interesting question, yet seems somewhat difficult to study. Several studies show that couples in "hostile relationships" do heal slower than "healthy relationships" (fighting affects the immune system). But I haven't been able to find anything with data regarding immune responses in "hostile relationships" vs being single. Those in hostile relationships have already increased their lifespan, although the hostility was likely not present for the entire relationship.

</comment></comment></comment><comment><USER13> Inspiring, but reality often doesn't play out this way. Eventually, trying new things wears you out and you stop appreciating them. Meanwhile there's a risk of increased stress from the neglecting activities that habits used to make easy, like managing your budget, brushing your teeth, and preparing cheap, tasty meals.

<comment><USER14> This is true, but the idea is to _manage_ your habits. It's a gardening exercise. At any given moment you're trying to make certain things into habits so that they will run in the background, while breaking other habits so that you'll feel alive.

(But maybe not _too_ alive: I can attest that it is certainly possible to exhaust yourself with an excessive rate of new experiences.)

</comment></comment><comment><USER15> Has no one here read Catch 22? One of the little commentaries in the book is one character who already figured this out- he insists on hating every second of life, because when you are miserable time goes by slowly.

</comment><comment><USER16> Joseph Heller embodied this idea in Dunbar. When your life is in imminent danger, you can extend it a great deal by remaining exceptionally bored.

</comment><comment><USER17> > Have you ever noticed that you can remember perfectly well what someone said > to you, but you don't remember exactly what words she used? Or perhaps you > can recall what was said but not in what language it was said.

Whatever else the article may have gotten right, this is false for me. I can, essentially, play back an audio recording of what a person just said. It doesn't work as well on languages I don't understand, but the recording is still there, it just ends up corrupted quickly because it takes a lot more to remember full audio than a few words. Also, I don't think I've ever forgotten which language something was said in, even though I can understand both French and Japanese.

That said, I have certainly noticed that other people never seem to get the words right, even when repeating things someone just said and it always bugged me that they'd change the words to things I just said a second ago.

<comment><USER18> Sounds to me like you have a form of eidetic memory. That's a pretty cool ability to have. Being a lesser human, I'm lucky if I can remember what Mom told me five seconds ago. (I'm not exaggerating.)

<http://en.wikipedia.org/wiki/Eidetic_memory>

<comment><USER17> I've seen that before, but it's not like the memories last forever and you can just carry a tape recording of everything you've ever heard or anything like that. I've never quite been able to do the same thing visually, though I've been able to form strong visual images for a very short time when concentrating.

That said, it has always seemed weird to me that people can't remember the exact words people just said and that they always seem to change them, if only a little.

</comment></comment></comment><comment><USER19> Just smoke some cannabis if you want time to stop (interferes with your ability to filter perceptual information in a linear fashion-- _nevertheless one's own personal freedom to choose to do such a thing_ ); the rest of us have jobs that require routines. Btw, don't pass the human species off as habitual, we are anything but in respect with the animal kingdom in its entirety (lack of a definite homeostasis in nature). With all that talk about measures, was there a mention of how spontaneity is to be measured? Breaking a habit just to find a new one seems frivolous. It seems to me one would have to be put in a truly unpredictable environment (such as the wilderness) to become less routine.

</comment><comment><USER20> Is the goal of life is to make it feel as though it will never end? 'Ever hear a shop clerk say, 'I feel like this shift will never end'? They're not excited about it.

Have you ever known someone who can't seem to stick with a job, an interest, or a group of friends? Do you think they are happy?

I don't think anyone is yearning for a life that feels like it will never end. What we want is to have a quality life, and one means toward that is to invest in others over time. Oh yeah, and marriage is _not_ a comfortable safe habit. It is challenge worth fighting for.

</comment><comment><USER21> Sounds like he is making a habit of breaking habits

<comment><USER22> I think the message is to have new experiences, ones that are odds with one's habits ideally, because the opportunity cost of habits is new experiences. I'd say you can do this by learning too, and one should pick exciting new experiences. Compress change.

</comment></comment><comment><USER23> I have similar thoughts on cannabis. When high, I have the feeling that habitual actions are much more difficult and you become more self-aware when you fix something to drink for example.

The effect seems to vanish for people who consume cannabis every day however, the brain seems to adjust to the new state.

</comment><comment><USER24> Whilst I was reading this article, I couldn't stop thinking of this:

"My life is the complete opposite of everything I want it to be." - <USER2> Costanza

</comment><comment><USER25> "We live in a world of meanings, not words or sounds. We live in a world of arcs, not points."

This is fundamental; line signifies the points; or the line is the meaning of the points; as when you fit a line to points of observations.

This fact is built into our perception and into science as well because all observations are points and meaning is the line that passes through all points; and therefore all meaning is interpretation.

The title is unfortunate ("To live forever"?) but the article makes good points.

</comment><comment><USER26> great, we can start by never returning to Hacker News again! See you never guys!</comment>


Job Map for every job - <AUTHOR> http://www.digital-geography.com/wp-content/uploads/2016/02/jobmap.html <comment><USER2> doesn't work

<comment><USER3> if you use an adblocker this will fail as it uses the indeed API which is not white-listed by adblocker...</comment></comment>


The Firefox religion - <AUTHOR> http://blakeross.com/2005/01/22/firefox-religion/

<comment><USER2> My only misgiving about this is the so-called "Awesome Bar" in Firefox 3, which introduces a lot of visual clutter for only marginal benefits. Fine. Maybe you _do_ know best. But I'd like to be able to switch it off (because I just don't like it) without resorting to installing an extension. Focussing on usability really should mean you let people decide for themselves what's "awesome" and what's just clutter.

<comment><USER3> I love the awesomebar. For instance, I can just type in the bug number of the bugzilla issue I'm working with currently (15592 for example.) And then hit tab-enter and I'm at the right page. The learning algorithm took about a day to stabilize but it works perfectly for me now.

If I'm trying to remember a page I browsed recently I type in a few keywords and the bar will pop up a list of related pages. Usually the page I want to review is the first in the list.

Give the bar a chance. I was leery at first but now I love it.

<comment><USER2> "Give the bar a chance. I was leery at first but now I love it."

I thought (after I posted) that it might turn out to be like tabbed browsing, which I first thought would be OK-ish but (like everyone else) I can't live without it now. I just wish the awesome bar took up less real estate. The visual clutter is appalling.

<comment><USER4> indeed. if they could get both url + title in a line (like gmail) that would fix it's horrible visual looks. there's also the fact that sometimes my computer is a bit too slow to lookup favicons for the links in the awesome bar causing things to look even more horrible.

</comment></comment></comment></comment><comment><USER5> This is a three-year-old blog post. I'm not sure how much still applies to current Firefox, especially the comparisons to other contemporary browsers.

That said, I often find Safari frustrating (cycle tabs with Cmd-Opt-arrows, for example, does not always work), but I have to resign myself to its foibles. To me, hitting the wall of the browser's functionality is what pulls me out of the dream. At least Firefox is getting ongoing extensions and patches.

</comment><comment> mark-t I wholly agree with the principle here, but I often find myself running up against firefox. For instance, there's this: <https://bugzilla.mozilla.org/show_bug.cgi?id=341067> . You'd think if that many people find a behavior unintuitive or undesirable, the developers might want to consider that there could be something to it. Of course, mom won't ever run into this because she'd have to change a preference to encounter it. It is possible to be _too_ focused on casual users.

</comment><comment><USER6> I have both opera and firefox open with default tool bars and opera is the clear winner it wastes less space. You have to turn off FF's book mark tool bar and then its a pixel for pixel tie pretty neat.

<comment><USER7> One of the tricks I've learned with Firefox is that under View > Toolbars > Customize... you can move the location of your "Bookmarks Toolbar Items" to the right of the menu bar. Then hide your "Bookmarks Bar" and the customized location remains. That way it doesn't take up an extra row of chrome.

<comment><USER6> I just turned it off all browsers have such great address completion I dont have a need for quick access to bookmarks. I use all the browsers for diferent things opera for general browsing, Firefox for js heavy sites, and Safari when I am showing off my websites to clients because it looks the prettiest.

</comment></comment></comment><comment><USER8> In case you are curious, this is the guy that developed ParaKey, which was apparently bought by Facebook.

<comment><USER9> I would have thought that Blake is probably better known as creator and lead dev of Firefox, rather than Parakey.</comment></comment>