Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Programming 101 online course recommendations?
58 points by brittpart_ on Nov 29, 2020 | hide | past | favorite | 42 comments
I'm non-tech but am developing an app.

Right now, there is a language barrier between the developers and myself because I don't know the jargon. I say something and they think its something else, I try explaining how it should work, they fix it and it's not fixed.

It's inefficient and I feel ignorant for not being educated/able to efficient communicate. Can you make any recommendations of courses or where I should start?

I think starting with computer science (anatomy of a computer, history of computing, etc) and then moving into Java is probably the way to go.

If you'd like to be able to understand the inner workings of your app, that's great, and there are a lot of good suggestions here for how to do that.

However, from your description it sounds like you're struggling to communicate about what the programmers should be building, rather than how it's being built. If that's the case, learning to program will likely not fix your problem, and will instead waste time that you could have spent on higher-leverage activities. I'd recommend the following:

1) Focus on learning only those technical details that are relevant to your app. For Thea (from your profile), you would want to spend some time understanding encryption, multi-factor auth, the basics of cloud hosting and storage (their respective Wikipedia pages would be a good starting point). You don't need to know enough to build it, but you should be able to talk intelligently about each of these aspects of the system.

2) Don't expect to successfully convey your design requirements in a single conversation turn. It doesn't matter how good of a communicator you are, if there isn't back-and-forth between you and the developers, they did not understand it. If they're not asking questions, have them diagram what they understood as they explain it back to you.

3) Stop your developers if they start using jargon and ask them to explain it. Just as you expect them to ask questions, they should expect you to ask questions. This way, you'll learn only the jargon that is relevant to your business requirements, rather than spending time learning stuff that will never come up in the context of your app.

Strongly agree with and endorse this advice. Learn to communicate.

To OP: If you think learning a programming language will make you a better English communicator you're on the way wrong track.

If anyone is using jargon, I recommend that as a team you make it a point to avoid it. No one should be required to well-versed in anyone else's jargon to collaborate on a job and it indicates they have some communication shortcomings as well. Work on it together.

Tech collaboration can be maze-like at first because I really think programmers are usually terrible at talking about our work to non-programmers. Avoid learning Java as a means to understanding someone else's English.

Yes, if you can get them to stop using jargon at all, that would be ideal. Jargon is, by definition, meant for communication within a discipline, and inappropriate for interdisciplinary conversation.

That said, translating jargon to English is a skill, and I wouldn't expect these developers to be able to just flip a switch and turn off the jargon. OP is going to need to gradually transition them to better explanations. A good way to do that is to constantly ask for definitions to terms you're unfamiliar with, and use the non-jargon versions yourself.

I may be presuming too much, but it sounds like perhaps you less need to learn to program and more need to learn to communicate with one another around technical topics. It's likely that (again, presuming here) if this is your first time doing this sort of thing, you're not able to provide precise (even if non-technical) feedback to your developers and likewise they may not be very good at taking non-technical information and translating that into actionable technical output (i.e., code and bugfixes).

Maybe try looking at the curriculum for product management courses first? I think they might give you quicker, more effective benefit than trying to build up knowledge of computers (especially from such a fundamental level). You'll spend a lot of time learning things that, while beneficial eventually probably, won't help you right now.

You definitely presumed correctly on all accounts. Product management is actually a very good suggestion, I can see how it would make sense. Thank you!

If you’re looking more to be able to intelligently communicate rather than program independently, I’d recommend the Harvard CS50 for Business Professionals.


I can’t recommend this enough for anyone looking to dive into Computer Science. I did it 7 years ago while in music school for no particular reason, and now have a computer science degree and am a software engineer at a well known company. CS50 quite literally changed my life.

There was a terrific article on Techcrunch this weekend about Rivers Cuomos' experience using CS50 to manage his creative output. Migrating his music spreadsheets to dedicated database-backed Python apps: "Hey, show me all the ideas I have at 126 BPM in the key of A flat that start with a third degree of the scale and the melody and are in Dorian mode and that my manager has given three stars or more to." ;)


I read that! How does that search query work, just based on his organization scheme?

I literally just started watching the first lecture today with the lamps! I am pausing and starting to look up terms as I go :)

In addition to picking up some of the basics, I suggest that at least part of the problem lies with the developers. Part of engineering is understanding the needs of non-technical people and translating those needs into actionable technical requirements.

This isn't necessarily in the skill set of every engineer, but in a well rounded team, there should be maybe a couple of engineers who are recognized for being able to do this. From time to time, the question has arisen on HN, as to what a "senior" engineer consists of, and the ability to interface with a larger community (e.g., managers, marketeers, users, etc.) is often mentioned.

You might not be able to solve that problem right away, but it could figure into your future hiring practices.

This is a really good point. I am reading "The Hard Thing About Hard Things" and Horowitz discusses hiring a VP of Sales and the requirements of the role aren't necessarily to get their hands dirty but more so to liaise.

Have you tried explaining what you want in a completely non-technical way?

A mistake/mis-step clients commonly make is trying to use the correct terminology/jargon which doesn't mean what they think it means, but the developer(s) think you know what you're on about so take you at face value.

Something common I've found is clients insisting on me using the latest buzzword technology even when it's not what they need.

And I'm not saying that's what you're doing, but trust your developers to do what you've hired them to do.

It's not a sign of being ignorant, everyone has different strengths, but you don't need to learn the entire trade just to communicate effectively.

One hint from my experience trying to explain technical things to other people. If they reply something in the lines of "Yes, I understand" that more often than not[1] translates into either "I have no clue what you are talking about" or "I misunderstood". Ask them to describe in their own words what you asked them to do. Be also prepared that their answer may make you realize that what you think you want makes no sense. You can't ask people draw red lines with green ink.[2]

[1] Of course, there are exceptions. but you would not be asking here if you worked with them. And you do quickly recognize the people that just nod and get sh*t done. They are rare, however.

[2] https://www.youtube.com/watch?v=BKorP55Aqvg

Honestly props to you for choosing self-improvement as the route forward instead of railing at the developers for not understanding you.

I would recommend picking a programming language and doing the basic tutorials for it to start, all languages have them.

If you hit upon something you feel the tutorial isn't explaining well, open a new tab, google that specific thing, e.g. "what is a function" / "how does a function work" / "what is a function in python" / "how does a function work in python" until you get the results you want, and read different ones til you find an explanation that makes sense to you. If the tutorial you chose is consistently unclear to you, pick a different tutorial. Use a variety of resources.

Which language kind of depends what you're working on. Python is the lowest barrier-to-entry, probably, but for all I know you're working on an iOS app and maybe Swift would be a better starting point since it's more relevant to what you're doing. Avoid Perl, probably.

Once you've got a handle on the general basics of a programming language, solve some basic problems. Use google to find a list of basic 101 programming challenges that suits you. Solve them.

Once you've got a handle on basic programming, try building a simple app of whatever nature you like. The classic example is a TODO reminder/checklist app, but you can do whatever interests you. The goal should be to pick something that you definitely don't know how to build, thus forcing yourself to learn how. It will involve a lot of googling but you'll find yourself learning rapidly. You'll feel it.

Lastly, StackOverflow is your friend.

We're going into the next iteration because the first product was terribly unusable and I want it to be a more efficient process this time. I remember at one point we were arguing about validation in a text field and I came up with bananas explanations and to add to it, I thought I needed to point out every field in the entire application where it needed to be fixed - mortified to say the least, and I learned that the word is "validation" for what I was trying to describe.

Right now, I think I should keep it as a web app because it seems easier (?) but will need to add desktop and then mobile (maybe mobile before desktop for upload and portability reasons, but I haven't decided).

MERN stack: ReactJS with Redux Node.js MongoDB / Atlas AWS EC2

I just checked out StackOverflow, we're going to be friends :)

The one thing I'd add to that with respect to looking at various Intro to CS MOOCs that are out there is this. Many of them are very good, e.g. the MIT 6.001x ones (assuming those are the current numbers), but many of the "intro" courses from top schools actually assume you pretty much know the basics of programming in at least some language. So the advice of starting from the basics is good.

https://learnprogramming.online/ is a great place to start if you're looking to learn about web development

While learning a language or gaining some technical understanding is probably never a bad thing, it sounds like you need to work out a better way to communicate your ideas. This would be equally useful when discussing your project with other non-developers. Try putting together a narrative story board or moving Star Wars figures around on a table... whatever works for you, really. it might help to understand the basic tools in a developer’s kit (objects, functions, etc.), but leave the programming to them. They should be able to tell you where there are problems and where you may need to compromise or deviate from your plan. A film director does not necessarily know everything about acting, lighting, cameras or whatever but is still able to explain how the scene should look in the end. just remember to be patient.

One of the silliest examples is I was trying to say that there are no requirements in text fields and all information is accepted no matter how it's formatted and they're like so remove the validation lol

CS50x has been perfect for me to 'start from scratch'. Not sure why you would prefer Java over others, depending on the platform you are developing for there's probably a 'nicer' solution.

The Java comment was made out of ignorance because I thought that was the most basic/friendliest one ha :)

Look into Behavior Driven Development, this is a methodology designed explicitly to prevent the problem you are experiencing.

If you really want to learn programming, I recommend https://eloquentjavascript.net/ , this book is targeted at beginners but has enough rigor to give you a good base. JavaScript is also lingua-franca of web development. It is also a much simpler language than JavaScript with a smaller learning curve.

The stack is actually Node.js, react, MongoDB and one other thing I believe

This is what I'm doing/planning to do right now, might help:

Java Programming I-II (https://java-programming.mooc.fi/),

Data Structures (https://fa20.datastructur.es/),

Software Construction (http://web.mit.edu/6.031/www/fa20/)

Are you a programmer?

First, some broad advice: I'd say start with tutorials in HTML and Python. Mike Dane has a lot of free video tutorials that some of my students have spoken highly of: https://www.mikedane.com/

Remember that with coding you learn by doing, so resist the urge to "just watch videos" or even "watch videos and take notes". I recommend to my students to always have a side-project of some type. Pick something that will motivate you, such a game, or an application that you find interesting. Have that motivate you to learn the next thing, instead of just picking new topics and reading them one at a time. When we have limited free time as adults, learning new skills is all about maintaining that motivation and direction, so when self-teaching project work is probably the very best motivation and guide in lieu of an instructor.

Self-plug: I teach coding courses for beginners. My program (Kickstart Coding) combines video-based graded coursework with weekly live sessions and 1:1 tutoring, for a $299/month subscription. Learn more here: https://kickstartcoding.com/

I wouldn't much care about history and anatomy at first, you can always get back to that later.

You can start here https://www.khanacademy.org/computing/computer-programming/p...

Or read about agile user story mapping, user personas, user stories and write your requirements that way. If that is not enough - get a UI/UX designer who'll translate your requirements into interactive prototypes which will somewhat serve as requirements for the developers.

Right now, we're moving into the second iteration because the first application was sooo hard to use lol that's on me.

This time, I'm starting with wireframes, then clickable prototype to show the show and then I'll write a spec sheet for like search and upload.

Do you think requirements can be written in plain sentences or should they go by component/user story/functionality/requirement in a spreadsheet?

Hi! If you want to learn programming, I'd recommend FreeCodeCamp, to learn the basics of Web Development. I found their course pretty great many years ago when I was getting started.

I hope you find it useful! Let me know if there's any other help I can give you.

Can you recommend a list of languages to start with first?

In addition to what most other people said here about how to improve communication in a team, I'd say that if you do want to learn some programming and how to think like a computer scientist, you can't go wrong with the MIT's Computational Thinking using Python series on edX.


I'm from a non-tech background and these two classes completely changed my world.

Yess! Exactly what I'm looking for!

Someone should build an app 5 different ways and discuss the pros and cons of each architecture/structure of the app. Haven't seen a course like that. There is plenty of stuff on Architecture, but not a single course on showing what bad architecture looks like.

Ooph maybe this is something you should do and send me the link ;)

My partner and I have been working on a few courses for beginners with the focus on explaining the general ideas of programming and computing in general: https://codexpanse.com/courses

Not a course but a tool/format I use for specs https://cucumber.io/docs/gherkin/reference/

gameswithgo.org is a fun way to learn, it is a free video series I did, using the Go programming language, with game based projects. But the content is serious computer science fundamentals.

Thank you! I will check it out :)

I highly recommend Codecademy

I don't think there's an easy answer to this question. Software engineers still don't know how to exactly or even efficiently communicate with each other. It's still an evolving field and process. In general, it is helpful to understand software development as a sub-field of systems theory and design, so any book that discusses systems should help one better understand software development.

In general, I do also echo some of the other comments. If you are helping to design the app, you shouldn't necessarily need to understand the implementation details. In my experience, clients, whether they be external or internal or colleagues, getting too involved into what they think the implementation should be is usually a disaster. It puts pressure on the system to conform to how they think it should be, which is usually not necessarily how it should be, and it basically adds unnecessary constraints. The real constraints should be what the software should do and specifications on that, including how the software is intended to be maintained and extended.

Some thoughts on some specific courses and books that I think would be helpful to better understand the goals of software development and design and ways to think about it all:

Programming for Everyone - An Introduction to Visual Programming Languages: https://www.edx.org/course/programming-for-everyone-an-intro...

I think this course should be taken by managers, designers, and even software engineers. The primary result is that you'll come out of it knowing state charts, which are an extension to state machines, and this will be very useful for thinking about software and organizing what the software should do. Handling state is one of the primary problems in software, and you might notice that all of the various paradigms (OOP, functional, imperative, actors, etc.) in computer programming relate to the various ways people think about handling state in a computing system.

How to Code: Simple Data and Complex Data:




These courses are taught by a designer of the Common Lisp language and based upon the excellent book How to Design Programs. It is essentially a language agnostic course that uses Racket to build up design paradigms that teaches you how to sort out your domain problem and designs into data and functions that operate on that data. The courses are part of a MicroMasters program, so if you really want to get into Java, that is taught in the follow-on courses.

Based upon your last comment, here are some book suggestions on how computers work:

Code: The Hidden Language of Computer Hardware and Software: https://www.amazon.com/Code-Language-Computer-Hardware-Softw...

The Pattern On The Stone: The Simple Ideas That Make Computers Work: https://www.amazon.com/Pattern-Stone-Computers-Science-Maste...

But How Do It Know? - The Basic Principles of Computers for Everyone: https://www.amazon.com/But-How-Know-Principles-Computers/dp/...

The Elements of Computing Systems: Building a Modern Computer from First Principles: https://www.amazon.com/Elements-Computing-Systems-Building-P...

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