My background is in business and apart from being intellectually curious and interested in technology, I have no previous programming, database or design experience. Like most non-techies, I have lots of ideas (of varying quality), but lack the technical know-how to create a minimum viable product (MVP) without outsourcing the technology.
As a non-technical person, you can easily persuade yourself that your idea is the core product and technology is only a vehicle, and can therefore be outsourced. Unfortunately, this reasoning will more often than not create an undesired outcome — months of interviewing software development houses, lots of paperwork, high costs, undiversifiable risk, unforeseen delays and quality control issues, and a working relationship where you are dependent on the availability and goodwill of your developer until you find someone else to takeover. And in the end, you may end up with nothing or a product that's not what you envisioned, and if you fail, it will be because of your reliance on others, and not on your own accord, which makes it even worse.
In September 2014, I decided to teach myself Ruby on Rails and create a web application. I had a simple idea, to map out the entire Israeli funding ecosystem to help startups find potential funding and promote the Startup Nation. I focused on three things:
- Israeli investors and investors with a representative based in Israel;
- Completeness of data; and
- Search granularity to allow startups to find investors that match their location, industry, market and/or investment stage. For example, find venture capital companies in Tel Aviv that invest in early stage cyber security startups.
I created a spreadsheet and designed the schema: column headings (e.g. name, location, investment stage) and attributes (e.g. seed, early stage). I then began to curate the data and populate the spreadsheet, constantly refining the schema to keep it simple and relevant. By the end of September, I had curated data for 250+ companies. I had intentionally begun with the data instead of learning how to code primarily because that way if I failed to build the app, I could at least open source the spreadsheet and make a meaningful contribution to the startup community. Now, it was time to learn how to code.
I spent a weekend going through Codecademy's tutorials on HTML and CSS. These exercises allow you to develop a basic understanding and quickly learn how to create layouts and style a web document. The objective is to understand what you can do with HTML and CSS, and get a feel for the syntax. Do not spend too much time on these tutorials.
I began to familiarise myself with the command line interface on my computer (Terminal on a Mac). I learned a few basic commands: how to create directories; move, delete and rename files; navigate from one directory to another. The objective here is to demystify the command line interface and use it on a daily basis so that you're comfortable with the tool once you start coding.
There are several articles and in-depth forum posts that discuss which programming language you should learn and why. Unfortunately, I can't tell you which language to learn, except that it probably doesn't matter. If you choose to learn PHP or Ruby, that's fine, or if you want to learn Swift or Objective-C to create iPhone apps, that's fine too. Don't spend time trying to find the optimal language for your project as most languages will do. Instead, focus on what you want to build in order to narrow down your options, review the syntax, read some material and start learning the language that resonates most with you. My only suggestion is that you select a language that has a sizeable online community and robust learning material. If you have a developer friend, seek their advice and listen.
I chose Ruby and spent a few days learning on Codecademy. These tutorials are nice and easy, and provide a good introduction to the language. You will even notice that with no prior knowledge, you will be able to understand some of the language. Your objective should be on application and understanding rather than memorising syntax. For instance, you will learn different ways to create loops, but focus on why you may want to create a loop in the first place. The list of companies you see on the 972VC homepage pass through a loop. Again, think about application.
I found this to be the hardest step; it took several attempts over a weekend to get it right. I recommend you backup your hard drive as you might unintentionally remove system files or mess something up when installing the technologies you need for your project. This is where you'll likely need a helping hand the most, so be sure to reach out if you have a developer friend or perhaps attend a Meetup.
You'll also need to download a code editor. Choose the tool your friend uses or pick the editor you prefer.
After I set up my coding environment, I spent the next few days on the Blogger tutorial by Jumpstart Lab, which teaches the four basic functions — create, read, update and destroy (CRUD) — that you need to build a simple Ruby on Rails app.
The objective here is similar to the other tutorials — focus on application and understanding, not on memorising syntax. Consider if you created any functionality during the tutorial that you can use for your project. It's also important that you accept that it will take time before you understand what you're doing during these tutorials. Just go with the flow and embrace uncertainty. Don't get discouraged and give up.
At this point, you've learned the basics: HTML, CSS and the language of your choice. You will also have familiarised yourself with the command line interface and set up your coding environment. In October, I started working on 972VC after I had completed the above tutorials and by the end of November, the web app was live.
During the first few days of development, I was unable to perform even the most basic tasks; in fact, I ended up spending more time on Google than coding throughout the project. The same will happen to you, which is why you shouldn't spend your time memorising syntax. Learn how to search effectively and be resourceful as this will be your most important skill.
Don't spend weeks or months ploughing through books, tutorials and screencasts, unless you prefer a more theoretical approach to learning. Instead, learn code and new technologies with a 'dirty hands' approach.
...what we would term the 'dirty hands' approach to learning, just like you did when you took apart your bicycle when you were a kid, or your dad's lawnmower or his radio. One of the best ways to learn as an engineer, or in anything, is to take it apart, study it, ask questions.
– Tom Williams, director of the NASA Marshall Space Flight Center's Propulsion Systems Department, on how NASA brought the monstrous F-1 "moon rocket" engine back to life
So what does this all mean? Say you have just copy-pasted some code into your project and it does what it's supposed to do, but you have no idea how it works. Using a 'dirty hands' approach to learning, take the code apart line by line, delete something, see what happens, add something, see what happens and repeat. It's time well spent to learn how things work.
Use tutorials, blogs and other resources when you need to learn how to do something specific. And be sure to check out and learn from open source projects as well.
Open source can be the most wonderful discovery for non-techies as the functionality you seek has probably been open sourced so you don't need to reinvent the wheel. For instance, if you're looking to lazy load images or remove unused CSS, you can find robust open source projects that are freely available.
Don't rely on others to develop your app for you.
You need to be persistent and tenacious. If you're a novice, learning to code requires a different mindset than you're used to, so of course it will be difficult. But by tinkering with a problem for several hours, you will gradually start to understand how it (sort of) works. As your learning progresses, you will no longer be content with the first solution you find — you will start to look for better ways to solve your coding problems.
Learning how to code is hard and it's even harder if you're doing it by yourself. Therefore, you need to consider each step forward, regardless of how small, as a legitimate success.
Stack Overflow is an online community for developers. It's a great place to learn and ask questions when you're stuck. Unfortunately, it's not always such a novice friendly place, but there are many stand up community members that will go out of their way to help you.
Ask questions, but don't expect others to solve your problems. Keep working on the issues you're experiencing even if you've posted these on Stack Overflow. You might even end up answering some of your own questions and contributing to the community.
Another great resource you should know about is CodePen, a social development environment for front-end designers and developers. I use CodePen for design inspiration and to view code snippets. As an example, if you want to integrate Algolia into your project, you can search for Algolia on CodePen and you'll find examples of how others have implemented search.
There are also Slack channels and other online communities that you can join to further your learning.
You're at a distinct advantage compared to an experienced developer. Since you have no coding knowledge or experience, you will need to strip your app idea down to its bare necessities. Focus on the core of your product and simplify wherever possible.
At a basic level, you can think of coding as an interactive jigsaw puzzle. Break your idea down into small manageable tasks that together will form your app. A task can be as small as adding the title tag or getting a hyperlink to work.
As you complete these tasks, you will see real progress. This will help reduce your overwhelm and risk of losing interest. Don't lose interest.
Try to work on your app on a daily basis, even if it's only for a few minutes, especially in the beginning of your project as it's important you become comfortable with your coding environment. Don't worry about best practices and conventions. In the beginning that's just noise, but you'll want to learn those principles as you progress.
I'd also suggest that you frequently deploy your app on AWS or other hosting service as this may save you time when you're finally prepared to launch.
Often when you're starting out, learning to code can feel futile. Is there a point to putting yourself through all this trouble for an app that you may never end up building? But if you really want to learn code and build then there's no excuse. And this applies to most things in life. Sometimes you just need to embrace the suck, dig deep and follow through to make things happen. 972VC is a perfect example that you can build an app, and that includes the code, design, content and everything in between, by yourself with no outside help and reach a global audience.
Take full advantage of the amazing online (and free) resources that are available. There are also engineers and designers that are willing to help and mentor you.
I've found that launching quickly and being responsive to user feedback has been the best approach. It would be awesome to create a feature-rich app with pixel perfect design and beautifully written code, but then I would never have anything to deploy. Instead, I tend to launch when I have the core functionality working and thereafter I'll make improvements to the design and code. However, a lesson learned is that design matters, sometimes even more than content. As an example, this is what 972VC looked like when I first launched.
Perhaps this was too early as the site was overlooked even though the content and functionality was similar to the current version. Since launch, I've converted the app to a static site powered by Hugo, but this is not something users have noticed. The new design, however, has been appreciated. In other words, you can initially get away with bad code, but not bad design.
Lastly, keep things simple. Figure out if you really need to automate everything now or if you can get away with doing things manually to save time and focus on more important tasks.
By following the steps above and adapting them to fit your needs, you may end up building a simple application over a few weeks or months. But, more importantly, you'll have empowered yourself, and learned a new skill. Perhaps you'll become a more valuable member in your workplace as you now understand code at a basic level and can communicate better with developers and designers. You'll also have the ability to execute your own ideas without spending large sums on outsourcing. In the case of 972VC, the total cost to build and launch the app was $9 (a RailsCasts pro subscription) plus the domain. If you choose to outsource development, you'll be in a stronger position to negotiate.
Now, if you don't want to go through this learning process, but still want to actualise your ideas, there are alternatives that don't require a line of code. You can integrate multiple tools such as Carrd, Typeform, Stripe, Zapier, Airtable and others to create an app.
Since I launched 972VC, it has become one of the most comprehensive resources for Israeli startups that seek funding in relation to private equity and venture capital, and accelerator and incubator programmes. In addition, it offers information on angel investor groups, crowdfunding platforms, coworking spaces and nonprofits that embrace 'Tech for Good'.
If you're part of the Startup Nation funding ecosystem and not on 972VC, join the community!
A few years have now passed since I learned to code.
My goal was never to become a developer, but to acquire a skill-set that would enable me to understand code and actualise my ideas. It has been as much a process of demystifying technology — "How does that work? Is it difficult to build something like this? What technology do I need to do that?" — as learning how to learn.
The process of learning to code has been challenging, and at times self-defeating, but it has never been a burden or felt like a chore. Instead I enjoy the logic and problem solving involved. I think this is key, there needs to be something that intrigues you about the learning process and the subject matter to overcome the inevitable challenges you will encounter. In particular, when you transition from online tutorials that are excellent introductions to code that help you at each step, to facing a blank screen as you start working on your idea and there's no 'get a hint' button to guide you.
But what happens if you persevere? Things change for the better. Building an app becomes more fun and things start to make more sense. Documentation becomes more accessible and you begin to understand your limitations so you can set more realistic goals. You develop a keener sense of how to solve a problem and are no longer, at least most of the time, using brute force, just randomly changing stuff in your code or copy-pasting code hoping that something will work. Instead, you rely on your problem solving skills to figure out what's going on. But the best part is the realisation that you can now actualise your ideas, build an app and reach a global audience.
I've compiled a list of resources to further help you on your journey to learn how to code and build your app. These are resources I either used or came across in building my app, and ultimately made 972VC possible. I hope they will be of equal benefit to you.
- Command line interface: Terminal Cheatsheet for Mac
- Installation guide: GoRails, thoughtbot
- Software package manager for OS X: Homebrew
- Code editor: Atom, Sublime Text, Vim, Visual Studio Code
- Tutorials: CSS-Tricks, Codecademy, Jumpstart Lab, RailsCasts, RubyMonk, The Ruby on Rails Tutorial, Tuts+
- Ruby on Rails open source projects: Open Source Rails
- Authentication: Devise
- Autocomplete: Algolia, jQuery UI, Select2, Selectize, typeahead.js
- CMS: Active Admin, RailsAdmin
- Front-end frameworks: Bootstrap, Foundation, Tachyons, Tailwind CSS
- Full text search: Algolia, Elasticsearch, PgSearch, Solr, Thinking Sphinx
- Icons: Font Awesome
- Pagination: Kaminari, will_paginate
- Pretty URLs: FriendlyId
- Database: MongoDB, MySQL, PostgreSQL
- Forums: SitePoint, Stack Overflow
- Code editors in your browser: CodePen, JSFiddle
- Web based office suite: Google Docs
- Ruby style guide: Community-driven Ruby coding style guide
- Version control: Git
- Repository hosting service: GitHub, GitLab
- Web hosting services: AWS, Engine Yard, Heroku (Nezumi for mobile and Adminium for your database backend)
- DNS and domain management: DNSimple
- Browser testing: BrowserStack
- Website security scanner: Detectify
- Load testing: Loader.io
- Analytics: Google Analytics, Segment
- Newsletter: MailChimp, Revue
- UI/UX tool: Sketch
- Domain generators: Domainr, NameMesh, NameRobot, Panabee
This is a revised version of an article I originally published on Medium.