Hacker News new | past | comments | ask | show | jobs | submit login
"I know how to program, but I don't know what to program" (devdungeon.com)
156 points by adamnemecek on May 11, 2016 | hide | past | favorite | 86 comments



Yesterday I was on the European Lisp Symposium, listening to the talk about Clasp and CANDO. Christian Schafmeister, who is a chemist, basically wrote his own Common Lisp implementation with focus on speed and C++ interop to have a base to run a molecule design tool on - because no available software was up to the task he's doing (designing stuff like water filters out of molecules)[0].

What it made me realize is that... I need to find myself something else to do than programming. Something else to learn about in greater detail. There are many, many interesting problems out there to solve, but you have to know about them first. Programming is great as a support speciality, if you have another one to support it. Right now the only thing I'm specialized in is making better tools for developers. Which we're in need of, true, but even more so are other domains.

[0] - Yesterday's talk should be up soon; in the meantime, here's his talk from last year at Google: https://www.youtube.com/watch?v=0rSMt1pAlbE.


I had the same realisation a few years ago. I switched from CS to math and physics. It is definitely more challenging but I do not regret the switch. Plus I discovered math can be quite fun.

Most of the most challenging software requires domain knowledge that CS/software devs do not have. Ultimately it is easier to go from a math/physics background to CS/software development than the other way round.


reminds me of what Donald Knuth had to say about academic specialization in Things a Computer Scientist Rarely Talks About:

  There might be some light on the horizon, however.  I predict that in the not too distant
  future, people in acamedmic life are going to define themselves not by one specialty
  area, but by two sub-specialties that belong to two rather different main specialties.
  This means that we'll have a web of interests, in which each person will serve as a
  bridge between different parts of the overall structure.  You can see that this is much
  better than having a tree hierarchy that branches out further and further, with nobody
  able to talk to the people on other sub-branches.  We'll have people that each belong to
  two areas, in two different parts of the overall structure.  Then we'll be able to have
  some hope of coping with new knowledge as it comes along.


"C++ templates are to common lisp macros, what IRS tax forms are to poetry."

This is a new favourite quote of mine.


Is there a list of real world, expert vetted list of problems that can be solved with software? Problems like the one you mentioned (not yet another project management app). It would be awesome if someone can curate a list like this and act as a bridge between experts from other fields and programmers who want to work on such problems.


I have a range of such problems. On major issue is that learning what the problem is, and exactly how to solve it, is a fairly major undertaking.

Also, because I'm in research, no-one is going to pay you for your work (or if you get paid, it will be embarrassingly small)

I'm not sure how many people there are who would be willing to invest a couple of weeks learning a new topic, to then write a program in that topic without pay. Oh of course, and probably useful to provide some minimal support going forwards as well.


What kind of problems are they? What field?

I understand what you are saying about pay. But here is the counter argument for it - say you have 3 problems to solve, that can be solved with software. You don't have time or patience to code it yourself, but you know your peers and friends also have the same 3 problems. If you can clearly write down the requirements, I think there will be programmers who will be willing to work on the problem - especially if they know there are people who want the problems solved and there is a possibility of turning it into a side project or a business.

Maybe you could pick a handful of the problems, post them here and see if there is any interest?


I won't do it in this post, but I'll aim to write up a blog post, and see if it gets any interest.


Such information is valuable and often guarded while products are under development.


Why would someone guard such information unless they themselves are making a product solving the problem? If I am a Chemist (or whatever other field) and I have some problems to solve and I am not a programmer, isn't it in my own interest to publicize the problems so someone else can make software for it?


Ideally we should just work together with those people, share the profits...


Ideally there would be profits...


That lecture is very interesting, thanks.


In a recent humble bundle, I found Automate the Boring Stuff with Python [0] which partially answers this. After going through the basics of Python, it describes building small projects such as scanning an Excel spreadsheet and sending email to people who are marked as 'not paid'. Projects like this give a different perspective to programming. Programming is not only about building grand projects. It can also automate every day stuff which you wouldn't normally call a programming task.

>>> contribute to an open source project

It's a very very common advice and I believe a wrong one, especially to novice developers. It's simply... Not that easy. Yes, there are tons of projects but most of them are pretty damn large or mature enough so that easy tasks have been a long time ago. Some projects (e.g. servo) have web sites dedicated to new contributors where you can filter issues marked as easy but there are not many projects to choose from. You can look for small, less popular projects... But that's not an easy task either. Plenty of experienced developers have an issue 'want to contribute, don't know where' and they find it tricky, it's much harder for the novices.

[0] https://automatetheboringstuff.com/


+1 for Automate the Boring Stuff.

I was going to hop in and say I keep a pad of paper where I just list out any process that I find myself doing rote, finding myself doing more than once, etc. A lot of it ends up being really simple. A six line bash script that concatenates my shopping lists from three text files when I am going to the store. A little python script that walks through a list of domain names, calls dig and dumps the output into a log file. I try to spend my computing time just thinking about how I can get more done with less keystrokes.

I'm around seven years into my career and only now do I feel comfortable with the idea of contributing to an open source project. You need to first work on a team whose workflow is structured in the manner that these projects work in (small, single purpose commits, reviews, etc.) and if that's not habituated, then simply figuring out how to do that first is a mountain in itself.


I really like this comment. Things like "scanning excel and emailing based on some criteria" are exactly what led me to programming as a career. I started off small, moved into larger projects, made a career out of it. Sometimes it's nice to revisit the "little" stuff and build something cool that _you_ want to see done, even if it's just a Saturday in a coffee shop size amount of work.


In regards to contributing to an open source project, I initially had a very similar experience to what you've described. I do disagree however that it is hard to find smaller projects to contribute to. Especially in the realm of browser extensions, there are a tons which I use day to day that are open source, and that I've had the opportunity to contribute to.


If you convert to CSV, emailing the non-payers is a one-liner in Powershell. Even converting the XLSX to CSV is pretty easy with the Excel .NET libraries, and well-documented in blog posts and StackOverflow.

Sometimes, the bigger challenge with automation is getting users to see a service, function, or utility as the underlying algorithms and calls, and not as this immutable black box interface. Once viewed this way, it's easier to separate automation into more easily defined goals.

---

Foreach ($nonpayer in (Import-CSV ("C:\billing\" + (get-date -F MM) + ".CSV") | where {$_.pmt -eq 0})) { Send-MailMessage -from Billing@example.com -to $nonpayer.email -SMTPserver relay.example.com -title " Payment Overdue" -body "Hello $($nonpayer.first-name), your payment for $(get-date -f MMMM) was not received. Please send payment today."};

(I wrote this on the bus on my phone)


You probably don't want to be hard-coding the address of your SMTP forwarding host in a script. If you have to change to a different one, you will have to hunt down this sort of usage and fix it.


Yes, but if it weren't hard-coded, it wouldn't count as being a one-liner. ;)

Besides, it's rare for DNS names to change; the point of DNS is the underlying server addresses can change without changing the name. And a service like SMTP relay should be less likely to change than other types of host.

But still, good point. This could easily be a Param if the function would be used in many environments.


Oh the DNS name will change if you use your ISP-provided SMTP server and you change your ISP from Acme Internet Services to A-1 Networks. :)


Ah, that's exactly the kind of situation where you'd want a param with a default. As an example:

PS C:\> New-Parameter SMTPSvr -TopHeader -BottomHeader -ParameterType string -DefaultValue "mail.example.com"

        Param(

                [string]$SMTPSvr = "mail.example.com"

        ) #end Param


I bought that humble bundle as well, but I didn't know that there was a website too. Thanks for the information.


As an aside, it sounds like a potentially useful problem to solve, making it easier for people to contribute to OS.

It's incredible that we have highly skilled (and in demand) people who would like to work for free, and the problem is finding ways of letting them do that.


I personally reached a similar conclusion[1] and ended up building small little chrome extensions that solve some of workflow problems I face daily. This plus using zapier to automate the repetitive has brought back joy to programming as a tool rather than end goal.

[1]https://medium.com/@hu_me/how-i-got-past-trying-to-reinvent-...


For people interested in science (finance would also work) there is an infinite number of things to be done to be useful (or simply interesting) at various levels.

Doing calculations by writing functions, reading files, etc. is a great way to progress. One can take some equations from an intro physics/chem/bio book and get started. Or doing some budgeting/personal finance/investing simulations using personal banking CSVs or online stock data.

It's a good alternative to game programming in that it may be more obviously pragmatic and appeals to people (like myself) who are thoroughly uninterested in games. I imagine it's a very different style of programming as well; less interactive and more geared towards producing results rather than an experience.

For more experienced programmers looking for interesting and useful side projects (maybe to show off skills for a job search), I think there is a lot of opportunity to work with scientists to help them with their research. It's actually pretty easy to reach out to scientists by going to public talks and seeing what they do, then chatting them up and seeing how to make yourself useful. The hard part is of course sticking with it...


I did just that in my early career as a hydrogeologist. I wanted to impress my soon to be masters supervisor, so I programmed a simple analytical model that is used in my field. In doing so, I learnt about how cautious groundwater modellers have to be in interpretation and fundamental problems in the mathematics. My supervisor still brings it up everything I see him at conferences.


Nice! I learned Matlab to do nonlinear optimization of GPS data to solve for fault locking depths and slip rates, and then a year or two later learned Python to do run FEMs of thermochronology data (also to get fault slip rates) on Amazon's servers in parallel. (Matlab was not really up to that task.) None of that was to impress my advisor exactly, but it worked...


I mean... "get a paying gig"? Lots of people don't know how to program, but really do need something programmed, so this is a pretty straightforward peanut butter/chocolate scenario, plus you get money.


I get what you mean but I believe the post describes a different issue and talks about side projects which are very different from paid gigs.

In paid gigs, you have hard or soft deadlines, commitments, etc. But sometimes you just want to code with no pressure, no deadlines, no managers, under total freedom and the money is not the first (and often not the second) priority.

That's why paid gigs often is not the answer.


I disagree here. Maybe if someone has had very little exposure to programming. I've found with an admittedly limited and completely anecdotal survey of developers around me that stress helps. The deadlines and people actually depending on you is a crucible that helps you get better much faster. You have to develop all the soft and hard skills that go with just pounding keys. Like project management and time estimation. Dealing with other people and evaluating problems.

You might get there with total freedom, but stress might get you there faster.


Let me counter your anecdote with my anecdote - I work much worse under pressure. Deadlines and commitments stress me out.

I suppose different people have different needs. I started with programming as a childhood hobby, and one thing I retained from that period of my life is the strong need for autonomy in the kind of projects I do, and in the way I do them. Which is, sadly, quite incompatibile with the way a typical employer wants you to work.


I get what you mean - side projects are notorious for never getting delivered. However, there is tons of things that can be learned from that as well. Balancing new and familiar technical choices, creating good tasks and assigning them to milestones, etc.


Who wants to hire someone whose experience is entirely exercises and tutorials?


It usually comes in a phrase similar to "I know how to program, but I don't know what to program."

"How" is about yourself. "What" is about others. Both are important, but "How" ususally comes first. The best way to transition from "How" to "What" is to trust that you have enough "How" (you probably do) and talk to enough others to understand their "What". That oughta give you plenty to do.

In the software community the rule is "don't reinvent the wheel." It's almost frowned upon if you rewrite a library when a mature and stable option exists. While it is a good rule in general, novices should not be afraid to reinvent the wheel. When it is done for learning or practice, it's totally OK to make a wheel!

Yes! The best thing I've ever done to get better ("graduating" to the next level) was to rewrite something else. Sometimes because I thought it sucked, sometimes because it was so cool that I wanted to grok how it worked from the inside out, but never because it needed rewriting. I have never learned anything reading someone else's code. I have always learned tons rewriting it.

Don't get the notion that you need to have the best idea ever before you write a program either.

I never write anything in order to get ideas. I write stuff in order to fill my tool box with enough skills and wisdom so that when I do get an idea, I'll be able to run with it.

How many of you have been in the situation where you think "I don't know what to program?" How did you handle it? What advice would you give to others in that situation?

Just write something, anything. You probably won't know where this will take you, but rest assured, it will take you somewhere you never would have found by not writing it.

Great post! Thank you, OP.


The "what" is also about yourself. To be a complete programmer, as a creative artisan, you have to generate requirements and specifications, not only code. Ken Thompson didn't wait for PRD from product management before starting Unix.

Being able to generate the "what" is necessary even if you're working on other people's requirements. This is because other people's requirements are usually not so detailed that code will pop out. There are plenty of gaps where your creativity is required to go from the high level spec to the detailed spec. That's the design aspect of development.

The requirements leave out the "how": but hiding in every "how" is plenty of "what"! "This requirement doesn't say how such and such is to be achieved: what do we choose to satisfy that?"

Someone who has no idea or interest in programming something if left without external requirements is probably not a great designer; he or she is lacking at least some aspect of the "maker" instinct. The maker is defined by making; you would have to wrestle the craft out of a true maker's hands.

If you get a completely detailed spec handed to you, then you're just a "coding technician". Someone will make a programming language which directly executes such a spec, and you're obsolete.


The worst "writer's block" is when I'm actively trying to think of ideas of what to program. I get the most interesting ideas for side projects when I'm doing anything but programming.

For example, watching the Eurovision semi-finals last night I thought, "the lyrics are so cheesy and awful, I bet they could be written by a computer program", so I spent an hour or two writing a very simple Markov chain generator using input from all this years' English language entries to generate fake Eurovision songs.

The other weekend I wanted to play with React and HTML5 canvas, so I wrote a starmap/world generator for an old desktop SF RPG I used to play. I was listening to a podcast about that game so it got me thinking.

These are trivial ideas, certainly not earth-shaking or money-making, but they're good practice and fun to work on and if nothing else I can just add them to my Github portfolio.


Lately, I've been getting better at catching my "someone should build X" ideas. I used to quickly (and unconsciously) discard them instead of thinking that I could build them myself. Sometimes the ideas aren't even related to software but I'm still keeping them. Who knows, should I ever get tired of programming I may actually build up on them.


Read this: http://usermethod.com/

Basically, if there's a product you've been looking for and can't find, make that. If that doesn't exist in your life at this moment... maybe hang tight until it does.


What if I know how to code and most of the tools that I can't find can easily be implemented in crude yet effective scripts? Usually I weigh out the cons and the pros and end up creating a simple script/task that I, as a programmer, can efficiently use, yet it's far away from being published. Am I the only one who makes something useful for self only to understand that it requires substantial effort, time and devotion to turn into an open source product?


Are you the only one? No way.

The vast, vast majority of the code I write is only used by me. It's not on github, it's not "published"; it's just to scratch an itch.


You could publish a gist, maybe.



I suffer from this. Recently someone told me,

"Don't think of "problems" in the extreme sense. A problem to solve could be as simple as increasing efficiency of something by 1%."


That reminds me of Star Trek TNG Geordi boosted the engine efficiency 1% or so.

Data asked why he is working on the engines Geordi says the engineer on another starship had his engines at something like 95%.

Then Geordi asks the computer for an update on the Enterprise's warp engine and the computer replies the engine efficiency increased a bit due to his changes.

http://memory-alpha.wikia.com/wiki/Force_of_Nature_(episode)


Honestly, I think the problem often isn't "I don't know what to program" but instead "None of my ideas are things I actually can, or want to, program".

I have lots of big ideas. Big applications, distributed systems, etc. My experience tells me they would take months or years of dedicated work, even working with others. I already have a job.

I have lots of small ideas. I don't want to spend time on most of them because they're not particularly interesting to me. I don't want to write a TODO application that's perfectly suited to me, even though I want such a thing. I don't want to futz around with the UI and write all the mundane utility functions. There's no interest there for me.

So there's just nothing I'm particularly passionate about enough to motivate me to spend my time on it. And that's no big deal, at work the I have the luxury of other people thinking up the big problems and providing me with countless amazingly intelligent peers with whom to create things. And at home I have other hobbies.

Edit: So, I guess to crystallize some advice from that, at least for people who are similar to me: try to get a job that satisfies your "I want to code amazing things" itch, and then enjoy everything else the world has to offer outside of work.


That attitude is fine if you're content making someone else's ideas. If you've got lots of big idea, do something about it. Who cares if it takes you months or years of dedicated work? If that's your hobby, then what is the issue? How much time is spent watching television? Cut that in half, and build your big idea.


I have other things I'd like to do nobody is going to pay me for.


Then what was the point of your original post? If you're happy with what you're doing(or not doing), then good! Otherwise it sounds like you do wish you were working on these ideas, and are looking for some reassurance of it.


You should probably ask the guy who wrote it, and not me.


I think this is more intended for beginners.


I'm opposite. I have so many ideas but don't know how to program. Just pay attention to anything that frustrates you in daily life, especially if you're researching something to buy. Is there confusion? lack of info? etc? Is there a way you can scrape content together to present information better for this audience? It's all about creating value, and I find reducing frustration or thinking on the part of a user is usually an easy way to start.


Noticing frustrating bits and lack of better options is a habit, I believe, which has to be developed. It's easier to notice horribly frustrating things and that's what startups often do, but that might be out of scope for many side projects. However, noticing small things that might be fixed in an evening or a week - that's a habit. I find it similar to the 'I want to blog, don't know what to write' issue.


Hey how about you spit ball some of those ideas over here? I bet there's plenty of hungry programmers in here eager to make them come to life


I have ideas for crazy things. Here are some:

Make a Wikipedia for code. Not a wikipedia about code, but a Wikipedia where the pages are the code. No references to outside tools/libraries, all the functions are either in the base language or references to other wikipedia-of-code pages. The pages are presented in a literate programming style.

Bring back the Inferno OS, but replace the original VM (Dis) with the Microsoft CLR.

Make a P2P publishing system for scientific publications. Let the contributing scientists have individual accounts, and manage reputations with a blockchain reputation system. Let people also donate their CPU cycles to scientific computations through this system. Require publications to store their data in a database format that your system's client can query and process with some programming language. Require all data tables, and results that appear in the publication's text be expressed as functions performed on data queried from the database (or potentially databases from other publications.)


Random idea: How about a mobile multi-player game where any player can grab and throw digital balls found around them and the goal is to get them in specific spots? They could be found using GPS/augmented reality and you could shoot them using your phone's sensors by swinging the phone or a gun/canon app with specified settings for example.


I've tried to find a technical co-founder a couple of times, it didn't work out. I think there are just so many "idea guys", it's hard to differentiate the good ones from bad ones.

I've been successful enough with my ideas that I just hire programmers and designers and just bootstrap everything myself. It's just easier that way.


I agree, and if you can come up with a way to get paid for this indirectly, like perhaps with Amazon referral links or something, even better. That way you're creating value for someone else, they don't have to pay for that value, and you might get enough to pay for server/hosting costs.


Out of curiosity, any reason why you don't want to learn programming?


It's not that I don't want to learn. I've made 3 serious efforts to learn, and although I understand how programming works, I could never do it at the level I want. However, the small amount of programming I've learned has given me good insights and allows me to communicate better with technical people.


> I could never do it at the level I want.

Even professional programmers can get that feeling when looking at some of the really popular apps/webapps/games. You have to keep in mind though that none of those are built by a single person but by at least a couple of people (usually dozens upon dozens). The key is to start small but to start somewhere and keep going.


Yeah, if I focused only on programming, I'm sure I could learn it well, but then my marketing/biz skills would suffer. It's better that I focus on my strengths.


ADD


Mental illness is not a good excuse. For example, Terry Davis wrote an entire operating system from scratch despite having schizophrenia.

https://en.wikipedia.org/wiki/TempleOS


A friend of mine who is a musician wrote about that : https://koketteriet.se/blog/i_can_use_vim_now_give_me_a_gui....


"... and sometimes i know what to program but it's such grunt work that i can't get myself to do it".


I hear ya. That's been my week.

I understand all dev jobs will have some grunt work, but once you've been doing it for 10+ years, it gets harder to work on mostly grunt work. My brain needs something more challenging.


give me a junior to flesh out my sketches, it'll be done in two weeks. ask me to go it all alone, see you in four months.


Programming isn't music. It's a tool to solve a problem. Not knowing what to build is a solution looking for problem. Generate ideas by getting out into the real world and finding out the pain points in life. Build tools to fix those problems. Preferably, pick a problem which people are willing to pay money to solve.

Still not thinking of anything? Go outside and play until you find something.

Edit: I didn't read the entire article. I couldn't get beyond the music comparisons. Rockstars in music get a lot more money and fun than rockstars in programming do.


Music isn't art. It's a tool to solve a problem. Not knowing what to compose is a solution looking for a problem. Generate ideas by getting out into the real world and finding out the pain points in life. Compose scores to accentuate those problems. Preferably, pick a problem which people are willing to pay money to have portrayed musically.

Still not thinking of anything? Go outside and play until you find something.


>> Rockstars in music get a lot more money and fun than rockstars in programming do.

I can think of Bill Gates, John Carmack, Sergey Brin, or even Mark Zuckenberg as counter examples :)


Hm.. I think the author is confusing "I don't have any good ideas" with "I don't know how to begin writing/structuring an application." He/she compares "I don't know what to program" with "I don't know how to write a song". But "I don't know how to write a song" is not the same as "I don't know what to write a song about". Lots of people have one problem but not the other.


My problem now is just available time. I have plenty of things I want to get done, it is just a time sink problem.


I know how to program, but most of the stuff i want to program are too complex/advanced for me to create.


I found it helpful to take programming courses at the community college. There you have someone who will actually evaluate what you've made and give you helpful suggestions for improvement. You won't have any trouble finding stuff to do because it will be assigned to you.


This is pretty much as a child learns, you don't put children to do complex things at once, if they wanna learn to write they have to make circles/lines to learn to write letters then words then sentences, they got to repeat what everybody has done already.


I guess the hard part is to find something complex enough that you'll get motivated and simple enough that you can get done on your own in the free time you have. And software is pretty good at teaching you how complex simple things can be.


Challenging is probably better choice for a word then complexity. Anyway, there are a few different kinds of complexity.

One comes from simply the problem at hand being large / complex and that's something that might be really hard to come up with.

However, it can also be challenging because of unfamiliar tech stack. Be it a new language, new framework, etc. Going too far in this direction can lead to projects being too hard to complete so you want to balance it with familiar technologies as well. For example, if you are familiar with Python and Javascript, picking Elexir and CoffeeScript might be too much. However, Python and CoffeeScript would make a good combination. You get the idea.


I have ideas and know how to program but lately I'm not feeling the passion that I used to have. I think I won't start anything unless I'm part of a hard working team that cares enough too =/


> Doing programming challenges is good mental practice, but they do little to help someone learn how to create a new program.

What does that have to do with the topic of knowing how to program, but not having a what? That is shifing the topic to "I don't know how to program very well; how can I get more practice".

How about developing an expert assistant program which helps writers stay focused on a topic?

People who actually know how to develop can have this problem.


Good idea, bad colour contrast.


Isn't there a website with good business ideas? See if you can find some programming challenges there.


Perhaps the knowledge of how to elicit tasks from customers is part of knowing how to program.



I have a list of project ideas 500 miles long and growing every day. I somehow feel obligated to build all of it and it gives me anxiety.


Mind to share it? I find generating good project ideas for me is quite difficult instead :)




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: