I'm graduating with a CS degree but I don't feel like I know how to program - <AUTHOR> http://stackoverflow.com/q/2823571/280598 <comment><USER2> I believe that there are two ways to get good at anything, "push" and "pull".

Push: You learn from books, classes, mentors, and studying examples, then apply what you have learned.

Pull: You have a problem that you must solve, then you learn what you need, any way you can, to build the solution.

I suppose there are pros and cons of each method, and I imagine that many people here have used some of both.

For the record, I am 100% Pull. I have absolutely no formal training. It took me 2 years to find my first job and then I was thrown into the deep end. It was simultaneously frustrating and exhilarating. There were so many times I didn't know what to do or didn't have enough "tools" in my box. So I had to figure it out and find sources of learning. But I always did. Any when I got that first thing working and then saw my customer's eyes light up, I was hooked.

Your CS degree may make you think that you're a "push" learner, but may I suggest that you adopt a "pull" approach. Forget what you think you know and find a job or a project or someone who has a real need. Then build what you need. You a several advantages over me: (a) It shouldn't take you long to find that job/demand/customer. Just keep looking. (b) You already have tools in your tool box, maybe not the right ones for the job, but you have _something_. And (c) It's easier than ever to adopt a "pull" approach. Help is everywhere.

You may feel frustrated, but I don't think you have a problem at all. You're in a great (and very normal) situation. Just adjust you attitude, find something to build, and do it.

<comment><USER3> The problem with pure pull is that you end up spending an inordinate amount of time reinventing the wheel, working towards one solution that you can see, while a much better and simpler solution is just around the corner because you don't have the breadth of knowledge to see past the sort of myopic view it provides.

On the other hand a pure push approach results in lack of practical knowledge, and frequently a "purity over pragmatism" mindset. As a guy who works regularly with grad students, this is frustrating -- the 100th argument consisting of me saying "yes I know the theory your professor taught, but here is how you do it for real given the bugs in the library implementation (or the runtime constraints or whatever)" gets pretty old too.

I guess I'm saying a pure approach for either has a tendency to miss a pile of benefits, and introduces it's own drawbacks.

<comment><USER4> Maybe the best thing to do is to try and sequence your "pushing" and "pulling." I actually graduated with a Political Science degree in 2009. I came to my first job not knowing a lick of programming, and the job didn't require it anyway. I got into programming because we were trying to do a website redesign and I wanted to help out. After we finished up that project, I kept going at because I liked it.

The first 9-12 months were tough. I read some beginner's books, wrote lots of really ugly code, and got things to work eventually, if only barely.

Then the code started to get prettier and more robust, and I picked up some more theoretical books like Leiserson's Intro to Algorithms to learn the theory. Having "pulled" around code for 9-12 months on my own, learning more formal computer science really allowed me to begin gluing those pieces together.

Everyone learns differently. Maybe a better approach for some CS programs would be to throw students into the water for their first year, let them struggle reinventing the wheel and solving practical problems as best they can, and then teach the theory and formalisms later?

<comment><USER5> I've taught computer science and I've seen that one's brain either understands computing concepts, or it doesn't. I've seen people with no programming experience pick it up pretty quickly. I've also seen people who were otherwise smart not get anywhere at all. If people can get past assignment, indirection, and boolean logic, they'll probably do fine. Understanding concurrency is also a sort of fundamental brain ability, but is something that fewer people have the ability for and is not necessary for every programming task.

<comment><USER6> There are different fields within CompSci that different kinds of people, from Math-backed to social types would be required.

</comment></comment></comment></comment></comment><comment><USER7> This touches on several issues.

1\. Should college teach you to program?

This is a philosophical question about whether a CS degree should be _educational_ or _vocational_. The general consensus seems to be that it should be the former not the latter. It should give you the theoretical foundation that you can apply to almost anything.

Therefore, college won't necessarily teach you any programming beyond what you need to read examples and do assignments, which may not be particularly deep.

2\. Do you like to program?

Frankly, every good programmer I know started programming long before they went to college or at least programmed outside of college for their enjoyment.

If you haven't done that and don't do that then I really have to question if you're in the right profession.

3\. Programming vs Being a Programmer.

Being a programmer as a job for which you are paid is different to programming. It involves many other skills such as design, reviews, dealing with people, writing documentation, supporting applications and so on. This is not something taught in school (nor could it be really).

I view the first 2-3 years of your work life as an apprenticeship of sorts. You've got the basic theory, now you have to go out into the real world and make yourself useful to somebody.

Many companies have graduate programs and the like. I think it's fairly important to start off somewhere that's good, meaning they'll teach you something (rather than simply crushing you, which, sadly, is more the norm).

If you can put in 2-3 years at, say, Google, Facebook or Apple after doing a good CS course, you'll have gotten yourself off to a very good start.

<comment><USER8> _1\. Should college teach you to program? This is a philosophical question about whether a CS degree should be educational or vocational. The general consensus seems to be that it should be the former not the latter. It should give you the theoretical foundation that you can apply to almost anything. Therefore, college won't necessarily teach you any programming beyond what you need to read examples and do assignments, which may not be particularly deep._

I personally think that's a problem. There is nothing wrong with being educational in your sense of the term, but I do think people with a degree in CS should be expected to know how to program.

Not expecting a CS alumnus to be a programmer is like having an architect not know how to draw buildings, or a surgeon not know how to wield a scalpel.

Sure, the degree should absolutely teach you _more_ than just programming, but there is no value in being a CS grad without knowing how to program. It's sort of the low level toolkit that you absolutely must be proficient in to being with.

A strange thing about CS education is that we have all these people studying Computer Science or even Software Engineering without ever looking at a significant piece of software. You learns lots of small examples and lots of theoretical bits, but as far as I can see most programs never take a look at, say, the Apache webserver and explain how all these small things come together to produce a successful piece of software. That's really a pity.

<comment><USER9> _Not expecting a CS alumnus to be a programmer is like having an architect not know how to draw buildings, or a surgeon not know how to wield a scalpel._

You do realize that with both professions you noted there is usually an apprenticeship time (internship/residency) -- and also in both professions you must licensed (in architecture typically after your internship and in medicine before the residency).

I do disagree though that there is no value in not being able to program. The main contribution of CS is not programming. It is in the theory of computation. I really do view programming as purely incidental.

You wouldn't expect a mechanical engineer to know how to repair a 2011 Ford Focus. They'll konw the basic ideas under the hood, but all of the technoogy specific aspects of it shouldn't be taught.

</comment></comment></comment><comment><USER8> I think there is huge value in trying to become what has been called a "full stack programmer". In the maning of: try to understand how computer systems work by understanding how each part of the stack works. Don't try to completely understand every subtle detail of every part - try to understand it like you understand how a combustion engine works.

My list would be:

      - basic electronic concepts, ie. transistors, XOR / NAND, bit shifters, adders
      - assembly language
      - hardware layout: CPU, registers, main memory, MMU, interrupts
      - operating systems: hardware interface, multi processing, file systems
      - networking: packet networks, ethernet, TCP/IP (sliding window, congestion control)
      - low level programming: C with fopen & co, sockets, structs, system calls
      - compiler construction (this is important!), parsers, translators, programming language implementation and virtual machines
      - algorithms: complexity theory, automata, CFGs, common data structures (heaps, maps, trees)
      - discrete mathematics, statistics

I think if you can explain all of these in at least a sort-of, hand wavy way, then you're on a good path to become an excellent programmer. I also think that is what a good CS degree should teach you. Try to explain to yourself in a children's story way what actually happens when you click your mouse button. If you don't know something, look it up.

<comment><USER10> Who has the time? And you can be employable knowing only 1 of those.

I've done that stuff; by necessity, I'm old enough to have grown up with computers and didn't have it all on a platter. My sons are learning "top down" and doing fine.

<comment><USER11> Who has time? You have your whole life to study it--it's not exactly time pressure.

</comment></comment></comment><comment><USER12> How refreshing. When I graduated I thought I knew it all.

 _"I see websites like Stack Overflow and search engines like Google and don't know where I'd even begin to write something like that."_

In response I'll quote part of the best paragraph PG's ever written:

 _"I've always been fascinated by comb-overs, especially the extreme sort that make a man look as if he's wearing a beret made of his own hair. How does the comber-over not see how odd he looks? The answer is that he got to look that way incrementally. What began as combing his hair a little carefully over a thin patch has gradually, over 20 years, grown into a monstrosity. Gradualness is very powerful. And that power can be used for constructive purposes too: just as you can trick yourself into looking like a freak, you can trick yourself into creating something so grand that you would never have dared to plan such a thing. Indeed, this is just how most good software gets created. You start by writing a stripped-down kernel (how hard can it be?) and gradually it grows into a complete operating system."_ \-- <http://paulgraham.com/essay.html> (His best essay IMO.)

</comment><comment><USER13> The reality is that no one knows how to do any professional job when they graduate from college. What we learn in college is mostly how to learn and how to problem solve. The problems we solve in college, whether stumbling through our first sorting algorithms or writing a paper about the role of Prussian nationalism in the 1800s, are not tied at all to the problems we have to solve professionally. And that's okay. When it comes to being a practitioner, whether producing commercial software products or writing analyst reports on public companies, the job itself is the best training. What you have to bring to the table is the curiousity and ability to learn and problem solve that get you up the learning curve quickly, and the professionalism that makes you a reliable and welcome colleague.

</comment><comment><USER14> Similarly, I did _not_ graduate with a CS degree, have been programming since 5th grade and yet feel I cannot program 'professionally' for a big firm that is loaded with CS geeks while I'm just an amateur programming for 13 years.

In this case, a lot of it is what you tell your brain.

<comment><USER15> Just study the following:

        - Understand time & space complexity
        - Security & Encryption
        - Concurrency & why ACID transactions are hard

That will save you from most of the most embarrassing and costly mistakes of programmers without a formal education.

I've actually worked at a company that wasted _millions_ on a fruitless project because management didn't understand basic automata theory:

        - Finite State Machines / Regular Expressions
        - Stack Machines / Context Free Grammars
        - Turing Machines / Anything Computable

I've been thinking of doing a presentation: Everything I still actually use from my CS education in less than an hour. (It will take you a bit longer to study and really absorb, but it will probably take a lot less than 4 years of college and cost much less.)

EDIT: Another good thing to study, though I'm not sure if there's a good single source: Why distributed systems are Hard and why distributed transactions are Really Hard. I really didn't care for the teaching style of the professor who staked out that whole area as "turf" so none of my materials were particularly memorable or good, but the information was valuable.

<comment><USER16>
         management didn't understand basic automata theory

Do tell more about it; as I feel that's not why they wasted millions.

IMHO management isn't required to understand much about CS, as long as the relationship with the developers is as between a customer and an engineer (i.e. customer asks for stuff, engineer explains what he can and cannot do).

Most problems with management comes from a disconnect with reality. Even when they know CS theory and/or could understand the complexity involved (ex developers); having bikeshed-style opinions and making demands with an iron fist in spite of developers advising otherwise (or the reverse, having developers on the team without an engineering mindset that can't think for themselves) ... that's the real poison.

<comment><USER15>
        management didn't understand basic automata theory

_Do tell more about it; as I feel that's not why they wasted millions._

That company tried to translate code from one programming language to another using only regular expressions. (This was a long time ago when you couldn't almost count on most "regular expression" implementations being Turing Complete.)

Perhaps the problem was really that engineers who understood the futility of the approach didn't speak up or weren't listened to. Still, I'd expect people managing an engineering firm that builds bridges to have some basic grasp of physics. So I don't think it's going too far to have those running a software company to have some basic grasp of the basic laws governing their field.

<comment><USER17> I'm going to play devil's advocate here, and point out that you can actually construct the proper automaton where the transition conditions are decided by regular expressions.

It might work like this: some programmer working on the project realizes something can't be parsed in a finite state machine, and 'cleverly' separates out one batch of regular expressions into a loop/recursive call. Repeat until the programmers are satisfied with the number of conditions they can handle. I've seen software that was actually written like this. Fortunately, the language it was designed to parse was pretty simple.

<comment><USER18> Wouldn't that still be a finite state automata?

You can create a submachine representing the regular expression transition conditions, and just attach that at the state you wanted, resulting in a finite state machine.

Of course this doesn't hold when you are talking about non-standard regular expressions, and it's probably a nice feature to have when creating the automata, but IMHO it still sounds like a silly idea when CFG-tools like ANTLR and YACC are available.

<comment><USER16>
          Wouldn't that still be a finite state automata?

He mentioned recursion, so no :-)

I also hate working with ANTLR/YACC ... heavy, hard to start with, steep learning curve. These tools are designed for industrial-strength compilers, where performance / flexibility matters.

And PEGs are better than CFGs (that's teeshirt material right there :))

<comment><USER18> Aaahhh, ofc, now I see why that wouldnt work. Guess I learn something every day :)

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER19> Being an undergraduate in a large public university gives you all sorts of great opportunities, like rooming with a painter (art studio/anthro double major). Among the many jewels I've borrowed from our conversations, one I particularly treasure is the notion of praxis.

Praxis (as I understand it) is simply the harmonious blending of practice and theory into action. As I'm beginning the exit trajectory from undergrad and into the "real world" (whatever that is), I've been reflecting on my education in the art of programming. I've realized that praxis has been the only substantial educational tool I've had.

Knuth says it best. "If you find that you're spending almost all your time on theory, start turning some attention to practical things; it will improve your theories. If you find that you're spending almost all your time on practice, start turning some attention to theoretical things; it will improve your practice."

</comment><comment><USER20> This is based on the experience of getting my CS degree 10+ years ago. I'm not going to prefix every sentance with IMHO.

Of course you don't know how to program, because most computer science programs suck. They teach how to code, the basic stuff like variables, if statements, loops, etc. You probably had a course in data structures and algorithms where you learned how to code your own lists and then how to sort them. You probably learned about object oriented programming with tons of examples about how a dog is a type of animal or maybe a foo is a type of bar. You probably wrote a ton of little one off programs to count the words in a file, calculate fibonaci sequences, fling disks around the towers of hanoi, or calculate interest rates.

Probably by the time you were deep into your data structures class you started zoning out, because heck, you can get by just fine with arrays. Same for algorithms, why are they making all this stuff so complicated, I can do most of this with just if and while. You never had to write a program more than a few hundred lines long, so object oriented programming just seems like confusing overkill. So do functions for that matter since you never had to do the same thing more than once in your program.

The problem is, you were taught all that shit in a vacuum and nobody ever told you how to put it all together. Since the programs you were working on were so simple, you never ran into the problems that those techniques were meant to solve. You were taught tons of theory, but nobody ever sold you on it. You have no idea how to apply all that stuff you learned. When and why to use each little bit of theory.

Maybe you tried to bootstrap yourself, start writing your own real programs. Maybe you had some success, most likely you got bored or frustrated and collapsed a few days later under the cruft of your own code base because you had no idea how to structure a real program.

Of course your professors will tell you that what you really need to learn wasn't the job of the university. They are there to educate, not help you get a job. I can understand their point of view to an extent, but what would you say about an english major who just got their BA and doesn't know how to write more than a 2 page paper. Theory & knowledge are just giant pile of bullshit to a person without a proper impetus to apply it in a non trivial application.

I realize there are some awesome colleges out there that are probably nothing like this. Given what I still see out of the junior developers I work with, I would say they are still the exception rather than rule.

<comment><USER21> "They teach how to code, the basic stuff like variables, if statements, loops, etc. You probably had a course in data structures and algorithms where you learned how to code your own lists and then how to sort them. You probably learned about object oriented programming with tons of examples about how a dog is a type of animal or maybe a foo is a type of bar. You probably wrote a ton of little one off programs to count the words in a file, calculate fibonaci sequences, fling disks around the towers of hanoi, or calculate interest rates."

That was all first year in my program. Second year was algorithm design, architecture, source control, *nix devlopment, etc (in addition to math, technical writing, etc).

I don't think my school is particularly spectacular, but even in second year we've gone beyond what you describe, and the people who take the attitudes you talk about have failed out. I don't think most CS programs are as bad as you say.

</comment></comment><comment><USER22> I'm graduating with a EE degree but I don't feel like I know how to solder.

I'm graduating with a ME degree but I don't feel like I know how to weld.

<comment><USER23> Except professional EE's don't solder and professional ME's dont weld. CS majors overwhelmingly become programmers.

<comment><USER24> Myself (and many colleagues) are professional EE's. We all own soldering irons and know how to solder in the most basic sense (I'm one of the few with a hot- air rework station and a stereo microscope).

About half of the professional ME's I know either own a TIG/MIG welding system and/or know how to weld.

</comment></comment></comment><comment><USER25> Do you bicycle?

Do you remember learning how to ride?

Knowing rigid-body mechanics, the theory of angular momentum, gyroscopic effect, etc. isn't going to keep your ass in that seat. Contrariwise, by trying and falling many times you learned how to balance yourself atop an unstable structure of wheels and frame when you were five years old.

Programming is the same. To feel confident in your ability to program, you simply have to _do it_. A lot. And you will write a lot of crappy, crappy code. Just keep doing it.

</comment><comment><USER26> Previous post/discussion: <http://news.ycombinator.com/item?id=1345281>

</comment><comment><USER27> I remember feeling the same thing in college... I expected CS to be a vocational program that would teach me how to write the applications I used on Windows every day. By Senior year, when not a single "real world" application was written, I finally realized it was all about teaching good theory and practice, and the practical stuff I'd need to pick up on my own.

<comment><USER28> Several students in my campus ACM chapter realized this and worked to make our meetings fill in some of the gaps. We had weekly meetings and covered things that attendees could get started using immediately. Code-alongs were encouraged. Popular topics had followup meetings. I don't even know how much time we spent playing with POV-Ray.

The lightning talks meeting was also really popular; one guy showed how to use Blender in five minutes, someone else talked about a darknet he had written, and another student used it to distribute Google Wave invites she had from her summer internship.

</comment></comment><comment><USER29> This topic hit home for me because I am graduating this year with a CS degree. As many of you have pointed out, a CS degree doesn't teach you how to program. I think it does give you a base of knowledge that you can then build upon to become a great coder.

I would say that 30% of my programming skill and knowledge comes from what I learned in class, while 70% comes from reading, watching lectures online, having friends critique my code, looking at open source projects, etc. But without that initial, introductory training from my CS department I would never have been in a position to understand those other topics.

Personally I would love to see a community effort to put together a free, open source "bridge the gap" curriculum for new college grads. It would focus mostly on coding best practices, code reviews, the importance of tests, engineering work flows, version control, staging servers, etc. In particular I think it should focus on real-world codebases as opposed to the one-off programs you constantly write in academia. Sure you can learn most of this stuff at your first job, but I think there are a ton of people out there who would love to learn this stuff, but they don't really know what they need to learn or where to start.

<comment><USER30> While it's in very early development stage, Oregon State University is creating an Open Source certificate program that will address some of these issues. The certification as planned will grant Masters degree level course credits and will be offered online. Course content will include LAMP stack development knowledge, basics of the development tool chain (issue tracking, mailing lists, etc.), release practices, and will require a three month hands on 'internship' working with a FOSS project to gain certification. Oregon State University would work to match make between students and FOSS projects looking to on board new contributors as part of this internship requirement.

</comment></comment><comment><USER31> I learned _extremely_ few industry-applicable skills in a prestigious CS undergrad program. Instead, I picked up 99% of my useful knowledge from a few other places:

\- One semester-long software development class, where the teacher did literally nothing while we formed small teams and worked on a project for a real client in or near our university

\- Software engineering internship in the industry

\- Extremely hard-ass Advanced Placement C.S. teacher in high-school

I learned a lot of cool theoretical stuff in college that is definitely good to know: functional programming, operating systems, machine learning techniques, compilers, graph algorithms, etc., but was never taught any core programming techniques or required to write very extensive code at any level of quality. It's all about _real-world experience_ , if that's what you're shooting for.

</comment><comment><USER32> I'm graduating with an English degree but I don't feel like I know how to write a novel.

<comment> T-hawk Well, bang out 100,000 words and you have a novel. (Also known as the James Joyce approach.) You can't fail at novel writing. A weld or solder joint can leak or disconnect, but a novel can't suddenly stop being a novel.

Whether you can write a novel that is compelling or sellable or worthwhile is another story (pun) altogether, of course.

<comment><USER32> The more detailed point I'm trying to make is that there's a reason that development is a profession. Even the masters have to spend some serious time to build things.

In CS programs I've seen many students that expect to leave with the ability to just sit down and code up a Facebook clone off the top of their heads. It's similar in IT roles. There is no class that is "what to do when network is slow 101".

</comment></comment></comment><comment><USER33> If you're lucky they actually taught you CS when they were giving you that CS degree. If you have a passion for creating software then don't worry, you're in a good place, but you've got tons of work ahead of you. Now you'll need to learn an entirely new set of skills. In terms of books I'd recommend Code Complete, Rapid Development (somewhat misnamed but quite good), and Refactoring. Having CS knowledge will give you a leg up because you will be able to apply certain skills and knowledge to hard problems that most programmers have a hard time coming by (compilers, low-level data structures, etc.)

If you're unlucky then you got a pseudo-trade-school education in Bachelor of Science clothing. Sorry to say that you probably got ripped off. But don't worry, if you have a passion for creating software then you can still use self-study to build up the knowledge and skills necessary to become a true software craftsman, and at least you're not starting at square one. Plus, a CS degree still looks good on paper and will help with job searches.

P.S. Learn source control inside and out, it'll pay massive dividends.

</comment><comment><USER34> Chances are he did find a job in the last 8 months, but here's my input (maybe someone else in a similar situation can use it): I graduated with a BS in ECE a few months ago, and also felt like I wasted 4 years for a piece of paper, but in those 4 years, I gained a lot of web development experience. While interviewing for the next few months after graduation, I saw that I knew a lot more about web development than EE, and that I was more interested in web development and CS. I landed a programming job where I'm learning more than I've learned during four years of electrical engineering courses. So my advice is to find what you're more interested in, and maybe you have college work or extra-curricular experience that can help. Engineering and CS share a similar thought process, and employers look for this in their technical interviews - especially if they know you don't come from a formal CS education. As others have pointed out, you can (and should) work on personal projects and freelance. Besides helping you learn and gain experience, you might even make some money!

</comment><comment><USER35> I think at many schools, how much you know about programming depends on the electives you choose to take. I could have taken many easy classes and had a much easier time going through school (probably had a higher GPA too). But, you need to think why you are in school in the first place. Are you there to get a slip of paper stating that you spent 4 years or so visiting classrooms occasionally throughout the afternoon/morning? Or, do you want to actually learn something of substance that you can use in your personal/professional development.

I like the first answer on the SO post, developing a website or writing a game will definitely make you a much better coder. When you build something from the ground up by yourself, you learn a lot more than just coding. You learn how to break out of deep troughs of despair. You learn how to work more than 8 hours at a time. You learn why its important to add efficiencies to your work habits. These are a few of the things you learn. But, these are the things that separate coders (the subset) from people with degrees (the superset).

</comment><comment><USER36> Maybe the guy has gotten a job in the past 6 months since this was posted?

<comment><USER37> Just for the record, I believe the OP over at StackOverflow is actually a woman. At least, I think their nick was "Wendy" when they first posted it.

<comment><USER36> I upvoted you. My apologies for the gender assumption.

<comment><USER37> It's ok! I know how easy it is to do, but in this case I happened to remember other posters on SO recommending that the OP not use their full name as their nick, since the question might pop up in a pre-job-interview Google search.

</comment></comment></comment></comment><comment><USER21> This is why I feel co-op should be mandatory for all CS degrees. I look at some of the people in my program who struggle with even basic programs and algorithms, and I can't help but think they're deluding themselves. A summer spent doing QA, then another as a junior developer, then two more doing real programming work would either disavow them of the notion that they should be a programmer, or give them the skills to at least get a job when they graduate.

I think it's shameful that colleges are perfectly happy to take 4 years of tuition and tell you that your shiny BS in CS will get you a great job when you graduate. A few profs will drill it into your head that co-op is mandatory, but that's only if you get the good ones.

</comment><comment><USER38> You can't expect college to teach you how to program. It's more experience and try-and-fail than anything else.

The college will teach you the basic, it will give you a ground to know how to start building. They won't tell you how to put the bricks together.

<comment><USER39> That is how it is right now, but run into a brick wall until you conquer it isn't the best approach. Guided practice would be much better. For that to happen though we need to get better at being able to describe what we learned by running into that brick wall.

<comment><USER38> "Guided practice would be much better". Totally agree.

That's why I help my co-workes with something they don't know and encourage them to do the same with others.

</comment></comment></comment><comment><USER40> Sounds like a case of mishandled expectation to me. Computer science is a mathematical and logical discipline; programming is a good means to practice that mathematics and logic, but it's not what computer science is.

</comment><comment><USER41> Pretty much I think this is one reason why the big names in software industry did not totally adopt the notion of graduating with a degree. What they did was to venture out on the real world and try solving some problems that they have by using computers and understanding how to program it. Pretty much I think it is safe today that 90% (or more) of what's being taught in universities offering CS degrees doesn't match up with what's happening in the real world. You want to program, sit on a computer, find something to solve and do it.

</comment><comment> mike-cardwell I was a better programmer at the age of 12 than most of the people who did my Computer Science degree were at the end of the course.

A worthless piece of paper. Had a fun three years getting it though.

<comment><USER10> I find I'm a better programmer every year. I look at last year's code and think "What idiot wrote that?"

Or maybe I just never get any better, hm.

</comment></comment><comment><USER42> I think this post complements the "How Effective are Technical Interviews" post that was on HN recently. A CS curriculum definitely prepares you for the theoretical questions asked in a technical interview, however, neither a CS degree nor a technical interview give you a real sense of how strong that person is at development.

I don't think this problem indicates the usefulness of a CS degree. Instead, I think it says that the only real way to learn how to program is to program.

</comment><comment><USER43> My suggestion is to find a side project or something to get involved with. That will give you something to guage where you are and ways to improve.

</comment><comment><USER44> I think a lot of students coast through a CS program and expect to be good at programming when they are done. A student should always have a personal project that he is working on outside of school (even if it is really small). Something that he cannot ask the teacher for help with. That way he has experienced unguided learning and has something to show off at job interviews.

</comment><comment><USER45> There is a difference between programming and engineering. I didn't take a software engineering course until after I graduated, but it was so worth it...

It's one thing to solve a problem once it's in front of you, but it's another to make the plan that exposes you to the problems, and keeps new problems coming along so that you can keep solving them, until one day... the project is done.

</comment><comment><USER46> You could probably replace "CS degree" and 'program' with a lot of different degrees and vocations. This is what people seem to fail to understand about collage, anything worth doing takes far more effort then making it through 4 years of college. All college does (at least the first 4 years) is get one ready for the lifetime of learning that is ahead.

</comment><comment><USER47> imho, cs degrees are not _supposed_ to be about programming. their focus should be purely theoretical side of computation e.g. heavy emphasis on algorithms, data structures etc. etc. which pushes them mostly towards applied mathematics imho. most programmers are autodidacts anyways, and picking stuff up is generally not _that_ hard.

</comment><comment><USER48> This sentiment is true, I think, for _any_ profession, graduating with an undergraduate degree just gets the door open, you still have a long way to walk. Similarly, if you're an English major reading _The New Yorker_ , you may not feel like you know how to write a decent piece.

</comment><comment><USER49> Graduating with a CS degree from where?

</comment><comment><USER50> Choose another career ASAP. Find something you love.

This is why there are so many bad programmers around. Depressing.

<comment><USER51> I respect your opinion, however I'm quite sure that person who asked this question actually cares about what he does because I don't think he would have posted this otherwise. I mean I could be wrong but this is what I felt when I read it.

<comment><USER50> Either he just doesn't have the natural aptitude, or he doesn't love it enough to learn.

I can't fathom how anyone could be a programmer/trying to become a programmer and not have constant side projects, partially written OSes, games, etc

It's easy to say "I want to be an X", but then you realize that you're not spending enough time doing X to become good at it. And the reason you're not spending enough time doing it is because you just don't love it enough, perhaps you love something else more.

He writes "I'm trying to improve my knowledge by studying algorithms, but it is a long and painful process."

Which is depressing. You do not learn how to program by 'studying algorithms'.

Do you learn to become a great author by reading the dictionary? No.

It doesn't sound like he wants to be a programmer for the right reasons to me.

<comment><USER52> I disagree.

The (quite old; it'd be interesting to see how this panned out) question came across to me as someone who, at the end of their many years in education up to this point, has got very used to directed learning. They are used to learning by being set a challenge with some accompanying theory and completing the challenge. They may well be good at this and enjoy doing it, but they haven't become used to searching out the material for themselves.

In fairness, for a corporate setting this may not be a great limitation! When you're working on someone else's project doing maintenance work as most developers end up doing, the need to seek out new problems and work out novel methods can come later; for now, your work domain is fairly closely controlled.

We may well have a CS graduate without the passion to stick at development, but this isn't necessarily the case. I did very little personal work then, because I had other interests as well and was doing plenty of programming for my course, thank you. I think we've got someone with the self-awareness to realise their limitations but insufficient experience of learning outside of education to know how to address this.

<comment><USER50> It came across to me as someone who wants to learn programming for the wrong reasons. For example they heard it pays well. Rather than wanting to learn it because they love it.

</comment></comment></comment></comment></comment><comment><USER53> If I was a fresh grad (or non-grad with some level of self-taught skill) I would be looking at companies that have formal apprenticeship programs. There are shops like Obtiva that do this sort of thing and look to lift people up through the "craftsmanship" approach.

</comment><comment><USER54> From my experience people can programm( _) or they can't. I rarely have seen someone "learn" programming. A CS degree has nothing to do with it.

Becoming a good programmer is something different.

(_) Deconstructing problems into smaller problems and expressing those in computer commands.

</comment><comment><USER55> I think I can help you out wiht the job situation..and a perfect match for what you're looking for. send me an email. gaurav.namit at lbi.com

</comment><comment><USER56> I'm sure that you've done a great deal of challenging/complex programs in pursuing your major.

If this is so, and you can't program, then how did they appear?

</comment><comment><USER57> This person should work for GE. Most of their senior and lead Software engineers can't code either.</comment>


Domain Pigeon adds 20K+ available Twitter names--more on the way - <AUTHOR> http://www.domainpigeon.com/

<comment><USER3> A great example of a startup iterating quickly and moving into relevant spaces. I imagine the cost to analyze available twitter names was minimal, and will provide considerable value to the "twitter brand" types.

Overall brilliant feature. Just wish they were a bit more active in responding.

<comment><AUTHOR> Thanks, I'm glad you like it! Checking Twitter name availability was relatively easy compared to redoing a large chunk of the site to accomodate more than just domain names.

What do you mean by "Just wish they were a bit more active in responding?"

</comment></comment><comment><USER4> I think you made a mistake here. Twitter names are not the same as domain names because the amount of info they contain will always be limited by design. But you've elevated them into the main namespace and diluted your core offering, in a manner that is unclear to new users.

It's a good idea to have twitter names, I just think that the position on the page of the names is bad - they should have been on a different page. I also think you should have gone with long domains also like I suggested last time.

<comment><AUTHOR> Given Twitter's popularity and current growth rate, I think it'd be a mistake NOT to elevate it the front page.

And anyway, visitors can always filter by domain names only or Twitter names only, allowing them to explore only what they're interested in.

I'm still considering the long names. One thing at a time :)

</comment></comment><comment><USER5> When I scan the headlines on HN, I usually pay little attention to the links I've already clicked on. I'm sure many others do the same. Guess that's a good lesson: create a blog post or a separate page, e.g. www.domainpigeon.com/twitter, when announcing a new feature.

</comment><comment><USER6> Just a little thing: if I click on a twitter name, it takes me to a page which says "this domain is still available".

Also, I agree with the idea of splitting up the domain and twitter names - <USER2> was far from obvious to me at first look to see which was which. Either that or move the legend to above/below the filters as it appears off the bottom of the page at the moment.

<comment><AUTHOR> Any chance you have JavaScript disabled?

<comment><USER6> Its entirely possible that it's something to do with my browser - I was looking at it from work where we have to use ie6 :(

</comment></comment></comment><comment><USER7> i don't use twitter, despite the multiple invitations from friends...at least not yet

nonetheless, as soon as i saw this, i knew i had to register my startup's name on twitter. thanks so much

<comment><USER8> probably a good lesson - basically where-ever possible - register the .com, probably the .net, the twitter,gmail,hotmail,yahoo,wordpress,blogspot names as well.

<comment><USER9> Who's gonna be the first to create a tool that does that all for you? :)

<comment><AUTHOR> There was a rate my startup type post a few months back of a site that checked the availability of user names on all those sites with a single click. If you can find it, it's probably as close as you're going to get (since it'd be very hard with all the CAPTCHAs to automate the name registration). Mechanical Turk, anyone?

<comment><USER8> <http://news.cnet.com/8301-17939_109-10223183-2.html>

that looks like the startup you're talking about</comment></comment></comment></comment></comment>


Why would anyone want to be Yahoo's CEO? - <AUTHOR> http://www.reuters.com/article/2011/09/08/us-yahoo-ceo-analysis-idUSTRE7870DC20110908

<comment><USER2> Um, the 10M severance package.</comment>


Steve Jobs – Official Trailer - <AUTHOR> https://www.youtube.com/watch?v=aEr6K1bwIVs

<comment><USER2> That isn't Steve Jobs. Steve Jobs wasn't a suave political mover. You had to force him to wear a suit and take a shower (and then be lucky that he was in the mood to do either of those things that day) in the time period the movie is portraying!

"Jobs" may have had a lot of facts turned around, especially in reference to Woz, but at least they were portraying the actual person accurately.

</comment><comment><USER3> The movie seems interesting, I will see it, the actor playing Jobs doesn't even look remotely close.

<comment><USER4> Michael Fassbender is very good at completely occupying the role, so maybe it won't matter too much. Seth Rogan as Woz though? I dunno.</comment></comment>


Show HN: My Shopify Story - <AUTHOR> Hello everyone! My name is Max Hopper, founder and owner of Maxwhale stores. Basically, I design Shopify stores for people looking for a platform to sell their products on. I'm still early in my journey as a developer, but so far I've had a lot of fun helping other people out and getting them started with a great looking website. I'm 16 right now, so I still have a lot of time to hone my skills, but I've been really focusing on the customer and delivering the best product that I can. This has been yielding some great results for me, as well as some very grateful people that I've been privileged to work with. If you're interested in purchasing my services or you're just curious about the things I do, feel free to visit my website at https://maxwhalestores.com. If you have any questions for me, email me at maxwellhopperbusiness#gmail.com . Thanks! <comment><USER2> This is not a "Show HN" material. It's a thinly veiled ad for your wedsite design services.

[https://news.ycombinator.com/showhn.html](https://news.ycombinator.com/showhn.html)</comment>


It's Not Illegal to Sell Anti-NSA Shirts Bearing the NSA Logo - <AUTHOR> http://www.volokh.com/2013/09/01/illegal-sell-anti-nsa-shirts-bearing-nsa-logo

<comment><USER2> Surely sticking a period into the citation of a legal statute for the purposes of altering its intent is some sort of fraud?

</comment><comment><USER3> The law apprears to have the _intent_ of preventing fraudulent credentials being bootlegged (eg, letterhead, security badges, etc). An interesting question is whether or not any of the relevant symbols are (or are _not_ ) in the public domain. My understanding is tha some private sector trademarks are protected under the laws regarding intellectual propery rights (trademark), but government documents and publication are not typically subject to commercial monopoly (eg, copyright) law.

<comment><USER4> While works produced by Federal Employees in the course of their employment are in the public domain as far as copyright is concerned; trademarks are different than copyright. And while the Federal Government and States and State owned Universities don't normally register trademarks with the patent office; they generally have a similar-to-trademark-protection of their marks, seals, and insignias under a seperate federal of state code.</comment></comment>


Your favorite programmer doesn't like coding - <AUTHOR> http://chegra.posterous.com/your-favorite-programmer-doesnt-like-coding

<comment><USER2> Yeah, sorry, but I just don't believe that. I've worked with plenty of programmers who, when faced with a perfectly acceptable off-the-shelf solution will happily slog out lines upon lines of code to roll yet another CMS, authentication, syndication, blog, social... you name it application. This isn't necessarily a bad thing. I'm not saying all programmers are this way, but a large part of what makes a good programmer is a self-belief that their ideas are superior to what already exists. External motivation is certainly a factor, but most of the best programmers I know code because of the rush they get from refining their own ideas.

<comment><USER3> You may not have recognized it, but a really good programmer always uses the off-the-shelf stuff if it will do the job correctly. Chances are, there's nothing on the shelf that does what they want exactly. So they code it. But when there is, they use it.

How many programmers do you know that wrote and use their own programming language? OS? IDE? Web browser? Email client?

There are thousands of apps that they use every week and don't code their own.

<comment><USER4> IMHO it's not hard to make the books, but it's incredibly hard to build the shelf well.

build the shelf a little wrong and chances are that the only books that will fit are the ones you have to write yourself

</comment></comment></comment><comment><USER5> Way to not get it.

I used to write games for fun. The problem was that there's a lot of boring stuff to writing a game: tracking key presses fluidly, polishing the interface, making sure it runs well on others' machines, etc. Also, the games weren't really that much fun. (Pretty much on par with 80% of the Flash games out there. "Oh look, yet another top-down shooter.")

Then I realized that I don't write games because I want to play them; I write games because I want to make them. Making a game is a game in itself. Why should I spend the time making my unfun game shiny when I could be having fun?

So now, I make "aquariums"- stuff happens on the screen, but there's no real interaction. The fun stuff happens in the code. Maybe some of it will eventually be useful in a real game, but that's not the primary goal.

</comment><comment><USER6> Aren't we past the idea that "ability to instruct a computer and/or runtime via a programming language" comes with a preconceived set of personality traits? Chester describes a certain kind of programmer well, but the idea all programmers conform to this behavior pattern (and, by extension, if you don't conform to the pattern then you're not a programmer) is silly.

Put another way, A lisp hacker, a java developer and a priest walk into a bar ...

<comment><USER7> Now you really have to come up with the rest of that joke, I'm dying to hear it! :)

</comment></comment><comment> T-R I'm not really convinced that a programming language that builds products from a subset of pre-made parts by making assumptions about implementation, rather than requiring the designer to plan in full detail and iron out design/logic inconsistencies, would really be all that useful.

But more to the point, I'd imagine a lot of programmers wouldn't even be interested in programming if it wasn't difficult. There's little point to a puzzle if someone just tells you the answer. Coding is all about choosing pieces, putting them together, and questioning whether the way those pieces are used will get you to your ideal solution.

Sure, some people code just to create output. Some people exercise just to burn calories, and hate every minute of it; those probably aren't the people climbing mountains.

</comment><comment><AUTHOR> What I was referring to is the shift from 2nd Generation Programming Languages to 3rd. The post is basically predicting the same fall off will occur when we transition to a 5th Generation. Hence, a programmer is more interested in creating something, since 5th Generation Languages is basically talking(not coding) and creativity process is what is common amongst the languages . <http://github.com/languages> \- This as a reference, assembly is not in the top ten.

Also, doesn't like code is not hating coding. It also encompass being disinterested. Thus if a better option present itself there would be no hesitation to adopted it.

My perspective is to view programming as a tool for being creative and when it is abstracted out like this, the question arises what other tools can we use to be creative?

Yes there will be a few people who still use 3rd generation language still but it would be like some people still use assembly today.

<comment><USER5> What is this about 2nd-, 3rd- and 5th-generation languages? I'm pretty sure most of us are using something like 20th-generation languages.

<http://www.levenez.com/lang/lang.pdf>

<comment><AUTHOR> [http://en.wikipedia.org/wiki/First- generation_programming_la...](http://en.wikipedia.org/wiki/First- generation_programming_language)

[http://en.wikipedia.org/wiki/Second- generation_programming_l...](http://en.wikipedia.org/wiki/Second- generation_programming_language)

[http://en.wikipedia.org/wiki/Third- generation_programming_la...](http://en.wikipedia.org/wiki/Third- generation_programming_language)

[http://en.wikipedia.org/wiki/Fourth- generation_programming_l...](http://en.wikipedia.org/wiki/Fourth- generation_programming_language)

[http://en.wikipedia.org/wiki/Fifth- generation_programming_la...](http://en.wikipedia.org/wiki/Fifth- generation_programming_language)

<comment><USER5> I see. One of the examples on Wikipedia of a 5th-generation language is Prolog. If you've ever looked at Prolog, it isn't just like talking. While it makes some problems easier, it makes others more complex. It's not the creative silver bullet you've made it out to be.

Among the list of 4th-generation languages is SPSS. Guh. SPSS works well enough for one-off analysis, but any sort of automation is extremely frustrating.

Based on these Wikipedia articles, (I'm not interested enough for further research) it does not appear to me that the numeric ordering has any correlation to programmers' productivity or the languages' usefulness in general creativity.

</comment></comment></comment></comment><comment><USER8> I don't know if I'm anyone's favorite programmer, but I derive enormous satisfaction from building working applications - even unsexy CRUD applications - from nothing. What we do professionally is already god damn wizardry: we turn text into something that moves.

</comment><comment><USER9> My response to this: My favorite programmer likes to code so he can create tools that allow him to create facebook clones by just telling the computer to do so, though instead of verbal, instead merely a: phing deploy-fbclone or whatever so chosen.

</comment><comment><USER10> I enjoy coding my own ideas and not that much others ideas. Basically from 9 to 5 I just code, from 5 to 10 I enjoy (coding).</comment>


Is the Political Novel Dead? - <AUTHOR> https://www.theguardian.com/books/2019/aug/24/is-the-political-novel-dead <comment><USER2> _> Even now, there are still a few novelists who set out to grab the reader by the lapels. Seaton commends Dave Eggers' urgent Silicon Valley satire The Circle (2013) for crystallising concerns about social media in the form of a thriller and causing ripples in the worlds of tech and politics._

Oh God, I hope not. I read _The Circle_ and found it to be a mess, making flawed arguments about subjects Eggers seems to not fully understand. (A review I wrote at the time goes into more detail on this: [https://jasonlefkowitz.net/2015/06/book-review-the- circle/](https://jasonlefkowitz.net/2015/06/book-review-the-circle/))

<comment><USER3> Yeah, It reminded me (not in a good way) of Cory Doctorow's works in the sense that even when I agreed with the general sentiment, I was infuriated by how much the "good" characters were winning by arguing against cartoonish villains.

</comment></comment><comment><USER4> _Nineteen-Eighty Four_ is the _Nineteen-Eighty Four_ of our time.

It's visionary. For example, even in this sense: we are just entering the age when you not only watch screens, but they watch you.

<comment><USER5> I'd say that Neuromancer, though it is not commonly regarded as a political novel, is more useful as a metaphor, given it predicts the explosion of players and political complexity created by the inability of any one group to exercise control over technology, which is a theme pretty much absent from 1984.

As to whether the political novel is dead, it is always kicking about in science fiction, where fashions have their own undercurrents that are much less subject to the whims of what can be regarded as literature. Science fiction, probably to its benefit, being rarely regarded as literature in the first place.

<comment><USER6> I own a copy but haven't read it yet. Heard very mixed things about it, from it being a masterpiece to it being boring or overrated. I'd like to hear your (and anyone else who's read it) opinions on it, maybe without any significant spoilers. Obviously I'll read it and come up with my own conclusion as to whether it's good or bad, but I'm curious.

<comment><USER7> Everything depends on taste but I love Neuromancer, it's really good at building a complicated world that isn't overburdened and I find the notion that it is "boring" kind of crazy! It almost reads like a thriller. Immediately one of my favorite books when I picked it up. It's certainly of our time, one of those books that you won't believe was written when it was. And it doesn't really feel dated, we might still be heading towards the world it portrays, hard to say... haha

<comment><USER6> Thanks for the reply. I read _Do Androids Dream of Electric Sheep_ , by Philip K. Dick and had almost the exact experience you describe with world building. I'll definitely give Neuromancer a read when I finish the three or so books I've started but not finished (it's not an issue of boredom - I'm just very busy at the moment).

</comment></comment></comment></comment></comment><comment><USER8> A lot of YA fiction tends to be pretty political. Many of them have dystopian settings where this is conflict with authoritative rulers. What I feel that we are missing is writers like Kurt Vonnegut.

<comment><USER9> Could you describe what missing elements Vonnegut had?

</comment></comment><comment><USER10> How can the Political Novel be dead? Isn't the 2019 Hugo Award Winner for best novel precisely a political novel? (The Calculating Stars is a novel about a woman attempting to become a female astronaut during 1952 America, in a setting where the earth is quickly becoming uninhabitable due to runway global warming.)

<comment><USER11> Weirdly, the politics takes a backseat to the protagonists personal problems, in particular her anxiety over public speaking. While the political elements are in there, they feel like they're in the background. The primary antagonist is motivated by a personal vendetta, not his political positions.

<comment><USER2> I haven't read _The Calculating Stars_ (yet), but from the description it sounds like the climate change in the story is caused by a meteor colliding with the Earth, rather than being caused by humans. That seems like an effective way to take climatic change out of its political context -- i.e., it's changing because of a _deus ex machina_ , not because of anything done by any person or group of people. In our world, climate change is a political issue precisely _because_ it's anthropogenic -- because it's something we're doing to ourselves so that some among us might profit.

 _Why_ you'd want to take climate change out of its political context, I have no idea. Someone's who's read the book can speak to that better than I can. It seems like a weird choice, though.

<comment><USER11> Climate Change is mostly just the motivator to get the space program going earlier. There is some political commentary in the way the government officials and public at large can't seem to comprehend the idea of a changing climate, but it's not a major narrative in the book.

</comment></comment></comment></comment><comment><USER12> It's simply been renamed Fantasy & Science Fiction.

<comment><USER13> Really?

</comment></comment><comment><USER14> A book about _The Troubles_ doesn't seem like it would be terribly apt today, would it? I don't know. No mention of one of the more (genuinely) important political novels, Submission by Houellebecq.

</comment><comment><USER15> Um, no. Not at all. I'd argue that it's the exact opposite. There are so many new novels that are very political, almost too many that I don't care to read anymore political novels. Especially in the Trump age. All the writers feel compelled to resist Trump through their writing/art.

<comment><USER7> Ironically on your point, a book seems like a poor way to send a message to this particular president...

<comment><USER15> lol...very true</comment></comment></comment>


Zero-Indexed Stock Market - <AUTHOR> https://maxmautner.com/2018/10/14/zero-indexed-stock-market.html <comment><USER3> Long term growth processes should still be charted in log scale even if you start from zero.

</comment><comment><USER4> There's a very obvious reason why they don't zero index: there's no data to observe there.

Any serious trader will want to zoom into the data where the action is - <USER2> pop sites are already doing

</comment><comment><USER5> They lie to you by labeling the y axis and using available pixels?

</comment><comment><USER6> Log charts are also far more valuable than linear.</comment>


Example Founder Dilution Over Multiple Financing Rounds - <AUTHOR> http://davidcummings.org/2014/03/09/example-founder-dilution-over-multiple-financing-rounds/

<comment><USER2> Are the numbers for Series B & C still representative of what founders are getting in tech today? They seem about right for Web 1.0 dot-com boom days, but looking at some of the financings on TechCrunch, recent startups (eg. Twitter, AirBnB, Uber, DropBox) seem to be raising $30-100M Bs for about 5-10% of the equity and $100M+ Cs for under 10%.</comment>


LaTeX, Instantly: Extract LaTeX from PDFs or Handwritten Notes - <AUTHOR> https://mathpix.com/ <comment><USER2> Oh god. An app like that, with a full pdf to LaTeX file converter, would be a godsend for the blind community. We usually sturggle a lot with mathematics in PDF documents, as it's usually not accessible for screen readers at all. TeX isn't the most pleasant thing to listen to, but it's at least plain asci text that any screen reader can process.

<comment><USER3> Hey, Mathpix founder here. I'm doing some research on how we can do just that, would love to chat if you're up for it, please ping me firstname.lastname@example.com.

<comment><USER4> This is a 1-liner in Wolfram Programming Language: 'Speak[SpokenString[ToExpression[texExpression, TeXForm]]]', for 'texExpression' an arbitrary TeX formula.

See [https://reference.wolfram.com/language/ref/SpokenString.html](https://reference.wolfram.com/language/ref/SpokenString.html)

I've been looking for a way to convert math texts to audiobooks, but haven't actually implemented anything.

<comment><USER4> See [https://www.wolframcloud.com/obj/george.w.singer/texToSpoken...](https://www.wolframcloud.com/obj/george.w.singer/texToSpokenString) for a demonstration. Put any tex string into the form and it will be converted into a spoken formula.

</comment></comment></comment></comment><comment><USER5> I've been looking for an open source solution to take drawn math and convert to text. I don't know if this is it but we certainly need more of it.

Windows comes with one I don't remember the name of, but I'd rather like to have a simple web browser canvas or webgl that could be drawn using a pen on a smartphone.

<comment><USER6> Last I looked into open source LaTeX OCR, albeit two or three years ago, the landscape was hardly different from this 2010 answer: [https://tex.stackexchange.com/a/1476](https://tex.stackexchange.com/a/1476) i.e. pretty sad.

(This is not it because it's a SaaS product.)

Edit: Also, on the commercial side, I've used several MyScript products. They're decent, but not amazing.

</comment></comment><comment><USER7> Well, this one is quite interesting, and would integrate nicely with tablet inputs for IDEs, but I have been burned often enough by non-free tools or SAAS (as well as the philosophy/ethics side) that I can't resolve to make closed- source and nonfree software part of my workflow. As a one-off, though? Maybe.

<comment><USER3> Mathpix Snip is free up to 50 images per month. Also, we are open sourcing our JS rendering stack very soon, which we hope will make publishing scientific content online more competitive with sharing PDF links.

<comment><USER8> FWIW, totally agreed with @MayeulC's comment (to the folks who might be willing to pay for this, the content is _too damn important_ to risk platform lock-in. For this service _to even get consideration_ , I would imagine that everything must be cleanly exportable, such that one needs only pay for continued use of the service).

That said, where I would seek a tool that _really_ adds value is auto- converting notes (text and math interspersed) into LaTeX, so that (as a value add) it can also be intelligently searched (coupled with an indexing+search solution). I think many academics/knowledge-workers might be open to paying for such a service.

Bonus if you can work well off just smartphone photographs of pages.

<comment><USER3> The content generated from Mathpix Snip can be pasted into any Latex compatible editor, so that avoids the lock-in you sometimes get with proprietary WYSIWYG editors. Plus as I mentioned we'll be open sourcing our rendering engine soon.

Thanks for the suggestion about adding search capabilities, we're thinking about this.

If you curious about it, I would suggest to just sign up and try it. If you spend a lot of time typing up Latex it's definitely worth having, especially for matrices / aligned equations.

</comment></comment></comment></comment><comment><USER9> They recently implemented a pretty restrictive freemium subscription model that has tempered my enthusiasm for it massively. 50 snips a month is nothing for grad students.

<comment><USER10> Grad students will just just maple/mathematica to directly generate latex from an expression.

<comment><USER11> Which grad students? In CS the use of these is long gone (at least in the two departments I've been in). I wonder how prevalent they still are in physics.

But I'm pretty damn sure that physicists, mathematicians and computer scientists all just type their equations straight into latex unless it's a super complicated computer generated formula, which you don't typically write in papers..

</comment></comment></comment><comment><USER12> I used to think converting from handwriting to LaTeX would be a really useful program and save a lot of time, but after typing LaTeX on a regular basis, the input speed is really not an issue. Sometimes I'll encounter a symbol I don't know, and then I draw it in here [1] and remember it for next time. When doing math, it's definitely not the bottleneck in getting my work done. I would definitely be slower with handwriting conversion, especially when you factor in fixing errors in its translation. I only see handwriting conversion being useful as training wheels for beginners, but would be interested if someone has a different experience.

Automatic recognition from PDFs is more promising for accessibility and reformatting, and also seems to be easier to do since typeset math is easier to recognize than handwriting.

[1] [http://detexify.kirelabs.org/classify.html](http://detexify.kirelabs.org/classify.html)

<comment><USER13> If you're not at a keyboard, or prefer to use a stylus, typing really isn't an option. Or if you want to capture the actual working-through of a problem, rather than working from an already-completed work. There are a number of use cases you might not find useful with respect to handwriting, but others might find incredibly practical.

<comment><USER14> I am comfortable enough with latex that I often work through problems on latex. For certain cases, with long expressions, it is actually simpler than handwriting, because I can copy an equation onto the next line and edit it in- place, hence, taking less time and ensuring I am not missing terms.

I have a friend who got so into latex that a few times he would mindlessly use latex code while handwriting things, like writing "\alpha" on the board instead of drawing the greek alphabet.

</comment></comment></comment><comment><USER15> Just curious if there is any plan for the Mathpix OCR/engine to transcribe tablet notes in real-time to a LaTeX document? That would be the holy grail for me.

<comment><USER3> Yes we're looking at this. What type of tablet do you own?

<comment><USER15> Currently I'm not using a tablet. But, I'm doing an M.S. in Actuarial Science. With > 90% of my notes being formulas, I would buy a tablet just for this feature :)

</comment></comment></comment><comment><USER16> I actually worked on transcribing math expressions to latex a few months ago with a Resnet backbone + LSTM + Attention.

All my code to train the model is available On GitHub: [https://github.com/bkkaggle/math- recognition](https://github.com/bkkaggle/math-recognition)

If anyone wants to chat about math expression OCR, I'd love to talk about it!

It's a surprisingly difficult and interesting (and under appreciated and unknown) area of research!

</comment><comment><USER17> This doesn't seem to support Wayland? Trying to create a snippet corrupts my whole screen. If I can get it to work, it seems quite useful.

This is what I get when trying to capture an image: [https://cdn.mathpix.com/snip/images/OvK0viJ9Q4k4evoCpnfvtIFl...](https://cdn.mathpix.com/snip/images/OvK0viJ9Q4k4evoCpnfvtIFlyZA9n4W43tIysMr0LjI.original.fullsize.png)

<comment><USER3> Hi, no we do not support Wayland. You can, however, try pasting images directly into our notes app snip.mathpix.com by copying the image to your clipboard and then pasting directly into the document.

</comment></comment><comment><USER18> I used this recently as part of a literature review I was doing. Worked _amazingly_ well and sped my work up substantially. Highly recommended.

</comment><comment><USER19> I enjoyed the Isaac Newton "testimonial" (the others as well, but that one was the first I read).

</comment><comment><USER20> @nicodjimenez Could you give the HN audience a quick idea of the technology behind this? Recurrent ConvNets like in [https://guillaumegenthial.github.io/image-to- latex.html](https://guillaumegenthial.github.io/image-to-latex.html) ? I remember seeing an "image to LaTeX" academic challenge, do you plan competing in it, if it still exists?

</comment><comment><USER21> FYI, I'm pretty sure this is wrong:

        \ell ( \theta ) = \sum _ { i = 1} ^ { m } \operatorname{log} p ( x ; \theta )

Given that we're summing over i = 1 to m (in the picture), I think that's supposed to be x_i :) Impressive, nonetheless.

</comment><comment><USER22> Just one note: Ctrl+Alt+M is a horrible choice of shortcut, as it conflicts with typing characters on many keyboard layouts. μ on my keyboard, for example. Ctrl+Alt is identical to AltGr and thus should be avoided for shortcuts in general.

<comment><USER23> You can record the shortcut to be whatever you'd like in your settings :)

</comment></comment><comment><USER24> Has anyone on this thread actually used this?

Would be interested in a product review

</comment><comment><USER25> Is there a recommended cloud or app solution that works well on the iPhone/iPad for writing a lot of LaTex?

<comment><USER26> There are several LaTex environments for iOS. I habe been using TexWriter, but very lightly so far. It worked well for me.

</comment></comment><comment><USER27> I wonder if it could be (ab)used to LaTeX-ize plain TeX.

</comment><comment> Iwan-Zotow there is also [https://github.com/falvaro/seshat](https://github.com/falvaro/seshat)

</comment><comment><USER28> i've used this. it's a really good solution to an odd problem. how often do you need the latex from a paper or book or whatever instead of a screen cap? if you're going to fold it into your own writing then you'll just write it out yourself since most stuff isn't _that_ complicated (and because ostensibly you know latex already). if you're not going to fold it in (and just use it in a powerpoint or something) then max-zoom+copypaste works fine.

on the other hand if it could do tikz now that would be magical (but as well know that's much much harder).</comment>


Show HN : WebRTC helped me to launch my startup after 2 years of waiting.  - <AUTHOR> http://www.voz.io Hi All ,I been working on my idea , A Voice CRM solution for 2 years.When I started brainstorming the idea the only option I have to receive phone calls thru browser was a flash widget or use 3rd party providers like Twilio or Phono .<p>Thanks to WebRTC we now integrated our VoIP services to receive and make calls directly thru browser .Please have a look and give us your feedback .Thanks Voz.io Team . <comment><USER2> Your website is eating the back button. I HATE that.

<comment><AUTHOR> Thanks for letting us know. Will fix it right away .

<comment><USER3> We'll even be able to tell when you finish fixing it because the stream of duplicate comments complaining about it will (hopefully) end :)

<comment><AUTHOR> Fixed :) Thanks for the feedback

</comment></comment></comment></comment><comment><USER4> I like the video. Can you share who made it?

"We'll let you know who's calling, based on previous call data, and algorithms." \- made me laugh

One suggestion - remove the "Powered by WebRTC". I doubt your customers know, or care, what that is. Perhaps, instead, replace with a "No Hardware to Buy" type of headline.

<comment><USER5> "Powered by WebRTC" means, to me, "we aren't going to charge you PBX prices" and "no need to install 3rd party software that may or may not work for each of your agents". If this has a competitive pricing model and support for Android we're in.

</comment></comment><comment><USER6> Please don't break the back button.

</comment><comment><USER7> Interesting product, though some of the language in the video and on page felt a little awkward.For example, the voice in the video says "just not only that!..." I don't know if it's just me but that does't seem right?

</comment><comment><USER8> Don't ever do that to my back button.

</comment><comment><USER9> Isn't WebRTC awesome! I created [https://github.com/imomin/videoChat](https://github.com/imomin/videoChat) to get my feet wet with WebRTC.

</comment><comment><USER10> Why do browsers let Back button be broken? So intrusive.

</comment><comment><USER11> You broke my back button. Prepare to die.

</comment><comment><USER12> On the front page, the image of the laptop is ON TOP OF the sign up button, so the right side of the sign up button cannot be clicked. Move it to the back. Great startup btw, I can't wait for launch.

</comment><comment><USER13> Cool service but the color choice as a weird vomit yellow for two of your feature icons is pretty awful. I suggest keeping it consistent with your blues. How about #1984A2.

</comment><comment><USER14> Your website also doesn't work when using an anonymous proxy/VPN, the geoip request fails (with 404) and I'm just left with a blank page.

</comment><comment><USER15> Great looking service and landing page, if you ever want to swap notes on WebRTC hit me up - we've been using it in production for 6 months now!

</comment><comment><USER16> Hi Sumang,

Can you put your email in your profile, I'd like to contact you about something I'm working on that may be of interest to you.

Cheers!

</comment><comment><USER17> Interesting what kind of pricing model do you have in mind for this? Per minute, per agent, subscription?

<comment><AUTHOR> We have per agent per month and per minute pricing for outgoing calls .

</comment></comment><comment><USER18> Smells like a honeypot to me.

Especially with no pricing.

Also no information about what is required, i'd guess a headset at minimum?

</comment><comment><USER19> Your site doesn't work without JavaScript. It should fail gracefully.

</comment><comment><USER20> When does Beta testing start?

<comment><AUTHOR> We are giving access in first week of Novemeber .

</comment></comment><comment><USER21> Hey Summan... Lets make it explode my friend! Cheers Dauton

</comment><comment><USER22> yes!! the back button is a horror!!!</comment>


Authenticated users can manipulate others fullname without their knowledge - <AUTHOR> https://hackerone.com/reports/244567 <comment><USER2> This is a bug report marked as resolved 3 years ago. Maybe I'm missing something.</comment>


Show HN: RPI-based temperature monitoring and reporting - <AUTHOR> https://github.com/steven777400/temperature-history <comment><AUTHOR> This isn't a product per-say, but an accomplishment in the "finish a project, no matter how small" category. Our house is heated by a combination of wood stove and electric blowers and the inside temperature varies quite a lot. I was curious about the nature of those variations, so I built a mechanism to record and report on them. My plan is gather a year's worth of data and see if any interesting patterns emerge.

I also used this opportunity to apply some ES6 for the first time - <USER2> syntax, interpolation, and Promises.

Future work includes downloading local outside temperature data (e.g. for NWS or NOAA) and charting it as a comparison.</comment>


The Cambridge History of China - <AUTHOR> https://rhinopoetry.org/reviews/the-cambridge-history-of-china-vol-2-the-six-dynasties-220589-edited-by-lbert-e-dienkeith-n-knapp-reviewed-by-anthony-madrid <comment><AUTHOR> I submitted this review because I found its style unique and interesting.</comment>


Show HN: Keep your data out of the wrong hands - <AUTHOR> https://www.truevault.com/blog/keep-your-data-out-of-the-wrong-hands.html <comment><USER2> Interesting idea. How does TrueVault Keep work with systems that want to process user data in the background? Won't you need to give a single account access to all records which will introduce the same single point vulnerability?

<comment><USER3> Good point! We are working through the details of those sorts of use cases, and are thinking of ways to mitigate the risks posed. A lot depends on the characteristics of your particular background tasks, but here are a few ideas we're considering:

\- Grant background tasks limited access to data based on some applicable filter. Imagine your medical software sends a nightly summary of tomorrow's appointments. Instead of giving the background task access to the entire database (including patient names and medical histories), grant it access to summary data about appointments which occur in the next 24 hours. In this example, there is still sensitive data at risk, but the scope is limited.

\- Have temporally limited access for scheduled tasks. Can we scope them to only running for 30 minutes once a day?

\- As a matter of practice, only run these types of jobs on machines that are isolated in a tightly controlled private network with an absolutely minimal attack surface.

We're still working out how to express some of these scoping restrictions in practice, but the core idea here is that we should be able to mitigate overall risk by being more judicious about how we grant access.</comment></comment>


Thoughts on "Dependency hell is NP-complete" - <AUTHOR> https://thefeedbackloop.xyz/thoughts-on-dependency-hell-is-np-complete/ <comment><USER2> Nix has a different approach to the problem, with its own set of benefits and drawbacks: packages do not specify version ranges of their dependencies at all; instead they reference them via variables (most commonly -- more generally they can be any arbitrary expression). For example if I'm writing a python package which depends on flask, I might list `flask` as a dependency of my package, or perhaps `flask11` or something.

        # pseudocode
        my_package = buildPythonPackage {
          name = "my_package";
          source = ./path/to/source;
          dependencies = [flask];
        };

Whatever that variable resolves to is the thing which will be built (and is itself defined in a similar way), so "version resolution" is replaced with a pure computation, the evaluation of an expression.

This approach offers a great deal of advantages, including very fast (roughly linear) calculation of what to build, full determinism in what gets built, and the ability to specify any arbitrary nix expression as a dependency, say some C library or a command-line tool, rather than being limited just to specifying packages written for your particular language.

However, of course, it does come with some drawbacks. Among them is the requirement that you often can't simply use nix out-of-the-box to build your code; depending on how developed the nix ecosystem is for a particular language, you might have to figure out for language X how packages are built, tested, installed, and linked together, and write the appropriate abstractions in nix. It also means that you won't automatically pick up later versions of a dependency when you (re)build it, which means you might miss out on updates. However, this latter drawback is arguably a benefit, because by the same token you won't accidentally pull in regressions due to an update in a dependency.

<comment><USER3> I don't understand this. You're saying that the way the dependencies are written down (with code, not declarations) changes the NP-completeness characteristics of dependency resolution.

I strongly doubt that, just like a search in an unindexed database table is O(N) no matter whether you write it as an SQL query or a for loop.

What assumptions about dependencies does Nix make / weaken that makes resolution linear-time? Any of those 4 Russ Cox lists? Or did Nix come up with some genius insight that shows that there's more than 4 core assumptions in the NP Completeness proof and the 5th one is the one that can be safely dropped?

<comment><USER4> > > Whatever that variable resolves to

The "fifth" or perhaps "zeroth" assumption is that the versions of all the dependencies must be resolved by a single system. If the developer does half the work by e.g., defining explicitly what flask is, then the remaining part of the system won't have to be NP complete any more.

I think that's what the parent post means by "won't automatically pick up later versions of a dependency". Since it isn't doing full dependency resolution, it doesn't need to solve the whole problem, but also doesn't give all the benefits.

<comment><USER5> Even though the developer does half the work, the system of 'Nix-using developer + Nix' is still constrained by NP-completeness, so in practice the two combined will not be able to solve the 'dependency resolution problem' in its full generality without a potentially exponential search.

So the real question is, which assumption does the package of 'Nix-using developer + Nix' give up?

<comment><AUTHOR> It violates assumption #4. With nix, you can have multiple versions of a package installed.

</comment></comment></comment></comment></comment><comment><USER6> > _I am personally very interested in the idea of allowing packages to mark > their dependencies as either "shared" or "internal". We could then disallow > shared dependencies from duplicating, but allow internal dependencies to > duplicate freely._

CMake has this feature. You can mark dependencies as either public, private or interface. With public meaning that sub dependencies can be reached through public interfaces and private that they just stay inside the program and can be replaced while still maintaining full backwards compatibility with your public interface.

</comment><comment><USER7> I didn't understand why it would be NP-complete, dependencies represent an acyclic graph.

However, this is the killer:

"Two different versions of a package cannot be installed simultaneously."

Get rid of that, and your problems disappear.

Which is why my linux server has:

1 gcc-4.8-base:amd64

2 gcc-4.9-base:amd64

3 gcc-5-base:amd64

4 gcc-6-base:amd64

<comment><USER8> > _dependencies represent an acyclic graph_

AFAICT that's not always true. Several scripting languages allow circular dependencies (Node.js, Perl) and so do some popular package managers (with specific workarounds, but the point is that such dependency constellations exist): [https://www.debian.org/doc/debian-policy/ch- relationships.ht...](https://www.debian.org/doc/debian-policy/ch- relationships.html)

Perhaps the problem needs to be examined differently depending on allowed/existing-in-the-wild circular dependencies.

<comment><USER9> >> dependencies represent an acyclic graph

> AFAICT that's not always true.

And you are right. apt-get has "upgrade" and "dist-upgrade" commands for a long, long time for a reason (the latter allows to upgrade packages in the presence of dependency cycles and some other cases that would be nasty if left in the middle of upgrade; obviously, no changes that need dist-upgrade land in Debian stable).

</comment></comment></comment><comment><USER10> At some point we will do a more in depth write-up about this, but I think we have a very unique take on this at RunKit as we've effectively installed every version of every package. It's actually more interesting than that, we've installed every reasonable combinatorial dependency result of every version of every package on npm.

Long story short, I think there was tremendous insight in npm 2's original model of having every dependency duplicated. Beyond allowing neat things like diffing two versions of the same package ([https://runkit.com/tolmasky/api- diff-example-4](https://runkit.com/tolmasky/api-diff-example-4) ), I think it most accurately portrays the meaning of a package/version.

The fundamental problem with trying to "unify" all the dependencies a program will need, is that it almost guarantees that code will be running in an untested state. Package A was written when Dependency 1 was at version 1.0.0. By assigning it the semver range 1.x.x (instead of the strict 1.0.0 dependency), that means that at some later point it will run against code its never seen or was tested against before. Sure, semver ranges are supposed to protect against this having a "meaningful" effect, but this simply kicks the can down the responsibility chain, changing the error to "human error" as if it makes a difference. For example, let's say at the time of publishing Dependency 1 had a bug that Package A accounted for. According to semver, a fix for this bug would qualify as a 1.0.1, but now Package A's workaround may actually _break_. The fact of the matter is: 1. rarely is code fully tested, 2. humans can't be trusted to properly assign semver, 3. semver doesn't even account for every possible "meaningful" change (I've seen performance changes that had devastating effects despite the "result" being the same). Different code is different code.

Now, you may be saying, what does this have to do with npm, it sounds like what you want is strict versioning -- the problem is that compounding this already tenuous situation with versions that change depending on the combination of dependencies you have in order to maximize deduping makes this problem even worse. Let me give you a _security_ example:

1\. Package A relies on Dependency 1, ranged at 1.x.x.

2\. Dependency 1 is found to have a security problem, so a 1.0.1 fix is issued.

3\. Package A correctly no longer suffers from this problem.

Later, Package B is added, which someone has maliciously, 10 sup-denendencies deep, added a strict dependency to Dependency 1 1.0.0. The deduping algorithm now says:

1\. 1.x.x and 1.0.0 are the requirements, I will use 1.0.0.

Now Package A is using an insecure version of Dependency 1. Previously, if every package was given its own dependencies, the issue would be scoped to Package B, instead it now infects everyone that relies on this Dependency. Sure, you can fix this by saying "dedupe after giving every package its highest possible dependency", but now you still suffer from monkey-patching affecting other code. You end up with very difficult to understand results. Sometimes, all the code uses the same package, other times not, seemingly randomly. The problem is that a performance issue is being turned into a functional issue. Package should be black boxes, not things you change the guts of regularly. There exists a tool for sharing dependencies: "peerDependencies". This says "I expect this to be around" vs. "I am including this".

The basic idea here is that you would never say "let's arbitrarily replace functions I've written in my program with approximately the same function in order to be able to be able to share them and reduce program size". This is nuts! Package versions should be considered hashes that only coincidentally have human names. NPM 2 is the closest I've seen anything come to this, and it creates the least surprises.

Most the remedies I've seen revolve around solving performance or efficiency problems this has. But I think it should first be important to make it right, THEN make it fast. You can definitely imagine a system that uses content- hashes to get the space efficiency without the cost of the conceptual separation. In fact, IED does this quite well: [https://github.com/alexanderGugel/ied](https://github.com/alexanderGugel/ied)

<comment><USER11> A couple points:

1\. The npm 2 model breaks down for client-side applications where you want to minimize the size. I don't want 5 slightly different versions of left-pad when 1 will do.

2\. I think of semver ranges in package.json as expressing what versions the developer believes _should_ work, and npm-shrinkrap.json or yarn.lock as expressing the latest versions that have _actually been tested_.

I think it's insane to use npm without shrinkwrap (even though it has its own problems). One of the best things about yarn is it generates yarn.lock by default.

I suppose this view is problematic in the context of RunKit which doesn't have any sort of lock file, and would be challenging to implement UX-wise.

3\. Packages with known security issues should be marked as deprecated, which will cause a warning to be printed every time it's installed.

Malicious packages can do a lot worse things than forcing another package's dependency to a specific version, though that is a particularly subtle attack.

<comment><USER10> RunKit generates a shrink wrap on the fly. In that sense it is the same as yarn.

</comment></comment></comment><comment><USER12> If you keep dependencies resolved at all times and operate on packages with hardcoded versions of dependencies, as Nix does, you can avoid that NP- problem.

Sadly, I remember people involved in Go packaging discussions being dismissive of Nix's ideas.

<comment><USER13> You remember incorrectly. Nix, unfortunately, just isn't suitable for non- final dependency resolution, i.e. libraries. And that's an important part of the mandate for language packaging discussions.

<comment><USER12> Nix itself isn't suitable for many things, but the ideas those guys came up with are great and work well.

</comment></comment></comment><comment><USER14> Relevant: The Science of Security, arguing against Turing Complete programs when less powerful will suffice

[https://www.youtube.com/watch?v=v8F8BqSa- XY](https://www.youtube.com/watch?v=v8F8BqSa-XY)</comment>