<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ed Toro</title>
    <description>The latest articles on DEV Community by Ed Toro (@eddroid).</description>
    <link>https://dev.to/eddroid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F112565%2Fdc25d387-8cac-4f3a-b8c9-a83f679e56a7.png</url>
      <title>DEV Community: Ed Toro</title>
      <link>https://dev.to/eddroid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eddroid"/>
    <language>en</language>
    <item>
      <title>After The Coding Bootcamp</title>
      <dc:creator>Ed Toro</dc:creator>
      <pubDate>Wed, 18 Dec 2019 15:23:48 +0000</pubDate>
      <link>https://dev.to/eddroid/after-the-coding-bootcamp-39fe</link>
      <guid>https://dev.to/eddroid/after-the-coding-bootcamp-39fe</guid>
      <description>&lt;p&gt;So you just graduated from a coding bootcamp. &lt;em&gt;Congratulations!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You're not alone. &lt;/p&gt;

&lt;p&gt;Many graduate from online courses and in-person coding bootcamps (aka &lt;em&gt;code schools&lt;/em&gt;) every year. This glut of talent may sound like bad news.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/FSCMuMTDRcFY4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/FSCMuMTDRcFY4/giphy.gif" alt="zombie horde of new devs"&gt;&lt;/a&gt;&lt;/p&gt;
Jobs...



&lt;p&gt;You, recent graduate, may be feeling pessimistic. There seems to be too much competition for junior positions. And it's getting worse by the (demo) day.&lt;/p&gt;

&lt;p&gt;But I welcome it.&lt;/p&gt;

&lt;p&gt;I believe that adding new talent to an ecosystem with room to grow actually &lt;em&gt;increases&lt;/em&gt; opportunity overall. Startups that would have otherwise thrown in the towel for lack of talent feel emboldened to venture more. Larger enterprises gain the confidence to start new projects. Careers are advanced at all levels.&lt;/p&gt;

&lt;p&gt;But my optimism for this new software industry landscape isn't shared by everyone. I've witnessed, both in-person and on Slack, many bootcamp grads struggling. &lt;/p&gt;

&lt;p&gt;That struggle arises partly from &lt;a href="https://en.wikipedia.org/wiki/Impostor_syndrome" rel="noopener noreferrer"&gt;imposter syndrome&lt;/a&gt;, which I'll address at the end. &lt;/p&gt;

&lt;p&gt;But it's also about not being sure what steps to take now that your job training program is complete.&lt;/p&gt;

&lt;p&gt;Junior devs are the foundation of a strong industry. We need you.&lt;/p&gt;

&lt;p&gt;So here are some tips for those wondering, &lt;em&gt;"Now that I'm done with my coding bootcamp, what should I do next?"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Day After
&lt;/h2&gt;

&lt;p&gt;What should you do as soon as your coding bootcamp ends?&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Go On Vacation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Xd6Y9TuDtylt5ug5PC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Xd6Y9TuDtylt5ug5PC/giphy.gif" alt="school's out for summer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The day after your training ends is not a good time for a vacation.&lt;/p&gt;

&lt;p&gt;Your last day of bootcamp isn't really your &lt;em&gt;last&lt;/em&gt; day. It's actually the beginning of a new journey. &lt;/p&gt;

&lt;p&gt;Your final project is not the capstone you finished just in time for your big presentation. Your final project is getting a job. &lt;/p&gt;

&lt;p&gt;Work on this new project with as much intensity as your final days of class.&lt;/p&gt;

&lt;p&gt;A coding bootcamp doesn't get you &lt;em&gt;there&lt;/em&gt;. It just points you in the right direction. It's a career accelerator. If you take time off to recover from your training, you'll lose momentum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Your Tuition-Money's Worth
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/hrQbnLjGXh1EqjauvT/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/hrQbnLjGXh1EqjauvT/giphy.gif" alt="get my money's worth"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a junior dev asks me for career advice, the first question I ask in return is usually "How are you taking advantage of the career services offered by your school?"&lt;/p&gt;

&lt;p&gt;Use them all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up career counseling meetings with their staff. &lt;/li&gt;
&lt;li&gt;Ask them to review your résumé. &lt;/li&gt;
&lt;li&gt;Schedule mock (practice) technical job interviews. &lt;/li&gt;
&lt;li&gt;Attend events held in their space, including the graduation of subsequent classes. &lt;/li&gt;
&lt;li&gt;Use all the resources they provide for local tech networking and job opportunities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In particular, make sure your bootcamp does a good job "training employers". &lt;/p&gt;

&lt;p&gt;Bootcamps should do more than attract applicants to the front door. They should also be growing and grooming a hiring partner network out back. &lt;/p&gt;

&lt;p&gt;Your school should be preparing companies for talent like you by managing expectations and playing up their reputations. If you apply to a company that has never heard of coding bootcamps, or never heard of your program in particular, ask your school for help.&lt;/p&gt;

&lt;p&gt;Do all these things even if your school doesn't have well-defined "career services". Push for it. You deserve to get your tuition money's worth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Spend So Much Time Reviewing The Basics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fberthpcttz1qnkij50rn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fberthpcttz1qnkij50rn.gif" alt="Homer Simpson studying"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many recent coding bootcamp graduates start their post-training lives with a review. Not having every lesson memorized stokes anxiety. So they delay the start of their new careers to return to lesson one.&lt;/p&gt;

&lt;p&gt;Sometimes that's worthwhile. If you're suffering from imposter syndrome, it can be a confidence boost to go back to some early exercises from the course and realize how something that confounded you a few months ago now seems so trivial. All your tech problems haven't gone away, but at least they've changed - they're bigger and more complex now. You've made progress.&lt;/p&gt;

&lt;p&gt;But don't linger on basic coding exercises. You don't need to master every lesson to get a job. You just need to know enough to build things.&lt;/p&gt;

&lt;p&gt;Instead of returning to Codecademy lesson one, create something. You'll learn more from a good project than from a review of fundamentals. And projects look much better than "badges" on a résumé.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Stop Coding
&lt;/h3&gt;

&lt;p&gt;Many bootcamp grads stop coding after graduation. &lt;/p&gt;

&lt;p&gt;Some dedicate all their time to the job search, but none to honing their craft.&lt;/p&gt;

&lt;p&gt;Some, after a long unsuccessful job search, lose hope and stop everything.&lt;/p&gt;

&lt;p&gt;Some, even after successfully landing a job, find themselves in a role that appreciates technical knowledge, but doesn't require writing code.&lt;/p&gt;

&lt;p&gt;Some alumni, both successful and not, attempt to return to coding weeks or even months after graduation, only to find their dev environments aren't working anymore.&lt;/p&gt;

&lt;p&gt;Don't be like those people. Don't stop coding after graduation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/621qY3Ez7D72Paw2TQ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/621qY3Ez7D72Paw2TQ/giphy.gif" alt="can't stop, won't stop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Make A Plan To Code
&lt;/h4&gt;

&lt;p&gt;The most successful graduates treat their post-bootcamp time with just as much discipline and seriousness as the course itself.&lt;/p&gt;

&lt;p&gt;Like the bootcamp did for you during the course, set up a daily schedule. Show up on time, not for class, but for yourself. Make a plan. Block out the entire day.&lt;/p&gt;

&lt;p&gt;Many people attend in-person bootcamps because they lack this kind of discipline. Otherwise they would have opted for a cheaper, fully-online, self-paced course. If you're one of those people that can't get moving without an agenda, here are some tips.&lt;/p&gt;

&lt;p&gt;Start with something simple, like making at least one public Git commit or pull request every day.&lt;/p&gt;

&lt;p&gt;Try &lt;a href="https://dev.to/"&gt;publishing one short blog about a technical topic&lt;/a&gt; every few days.&lt;/p&gt;

&lt;p&gt;Then, over time, make your agenda more complex. &lt;/p&gt;

&lt;p&gt;For example, at the beginning of every week, find a list of local companies you'd like to work for. Figure out the skills they need from their job listings. Then, for the duration of that week, target your post-bootcamp training on those items. Did your bootcamp teach JavaScript, but there's a local company you like hiring for C#? Then spend a few days getting familiar with that tech landscape. Tap into your alumni network for support.&lt;/p&gt;

&lt;p&gt;A coding career is like a video game. The early levels that seemed so difficult are a piece-of-cake now. But there are many harder levels coming up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xVF25IfuYQwXm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xVF25IfuYQwXm/giphy.gif" alt="measuring life in experience points"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like many games, the secret is to be leveling up daily. Every line of code you write is another experience point. And every point you earn gets you closer to the next level of your career.&lt;/p&gt;

&lt;p&gt;ABC - &lt;em&gt;always be coding&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finish Your Homework
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/XcRY3TTnXmUslKsMlH/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/XcRY3TTnXmUslKsMlH/giphy.gif" alt="running from homework"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may not have done your best work during bootcamp. Maybe you passed the course, but you skipped a few projects or assignments. Right after graduation is a good time to finish your homework. &lt;/p&gt;

&lt;p&gt;Employers may call your school for a reference. They may ask how well you did in the program. A good way for a busy teaching team to jog their memories is by looking up your scores. Leave a good impression in the gradebook.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Projects, Not Badges
&lt;/h3&gt;

&lt;p&gt;Everything feels rushed during a coding bootcamp. That's the point of rapid skills training.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ejKpjEfcPuYve/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ejKpjEfcPuYve/giphy.gif" alt="rushing your project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, students feel like there's never enough time to work on their pet projects.&lt;/p&gt;

&lt;p&gt;Weirdly, after bootcamp ends, students rarely return to those same projects. Many startup &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product" rel="noopener noreferrer"&gt;MVP&lt;/a&gt;s are sitting open-sourced in the GitHub repos of coding school alumni.&lt;/p&gt;

&lt;p&gt;Right after graduation, but before the crunch of a new job, is the perfect time for highly effective project-based learning. Your old code doesn't yet feel like a distant memory and you finally have time to fix those rough spots you had to plaster over for your final presentation. You can even create a prototype of that startup you were envisioning before you started the course.&lt;/p&gt;

&lt;p&gt;Instead, students find any excuse never to return to the hackathon-quality code they rushed out for their demo day. They'll spend all their time applying to jobs. Or they'll try to earn as many online training "badges" as they can.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT0GqhwSnGFFGck9y0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT0GqhwSnGFFGck9y0/giphy.gif" alt="stinkin badges"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, as a junior dev, nothing shows off your skills better than a good portfolio of projects. You'll learn more, and more quickly, from projects than from re-watching old lectures.&lt;/p&gt;

&lt;p&gt;If you can't think of something to build, here are some project ideas you can use for inspiration.&lt;/p&gt;

&lt;h4&gt;
  
  
  Polish Your Old Projects
&lt;/h4&gt;

&lt;p&gt;Improve the final project you worked on for your demo day. You can also return to earlier projects from mid-course and make them portfolio-worthy - or, if it's not worth the effort, delete them from your GitHub.&lt;/p&gt;

&lt;p&gt;Make your projects unique. Everyone in your class probably built the same stuff. Add something that makes your app stand out from your peers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Employer-Inspired Projects
&lt;/h4&gt;

&lt;p&gt;Find the skills employers want, then build something using those skills. &lt;/p&gt;

&lt;p&gt;Try to re-build an employer's product. For example, if you're interested in working for a health IT company, built a doctor's appointment scheduling app or a prescription drug tracker. &lt;/p&gt;

&lt;p&gt;If you're interested in design, mockup a new homepage for an employer's site or a landing page for one of their new products. &lt;/p&gt;

&lt;p&gt;If you're interested in devops, try to launch a basic site on the company's preferred cloud provider.&lt;/p&gt;

&lt;p&gt;Not only does this kind of work demonstrate a passion for your target company's niche, but it also makes you appear like a potential competitor - one that an employer would rather have working &lt;em&gt;for&lt;/em&gt; them than against.&lt;/p&gt;

&lt;h4&gt;
  
  
  Freelancing
&lt;/h4&gt;

&lt;p&gt;Freelancing is intimidating for junior devs. Imposter syndrome kicks into high gear when money is on the table. &lt;em&gt;I just (barely) learned how to do this! How can I justify charging people money for it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Just like that grade school myth, juniors tend to think there's a "permanent record" that'll be marked in bright red if they fail to deliver on a freelancing gig. Your career could be over as soon as it starts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o6MbojOAmJKa3048g/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o6MbojOAmJKa3048g/giphy.gif" alt="permanent record"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead, new bootcamp graduates should consider freelancing another step in their educations. This time, however, instead of paying to learn, you're getting paid to pick up new skills.&lt;/p&gt;

&lt;p&gt;It's not going to pay much. Often junior devs agree to fixed-price projects that, given the number of hours and inevitable scope creep, turn into effectively less-than-minimum-wage gigs. But that's ok for your first time. And it's not forever. And, even if it turns out badly, you'll still have learned something.&lt;/p&gt;

&lt;p&gt;Also, though this may sound hard to believe, there are plenty of low-skilled coding opportunities available - usually the kinds of things professional freelancers wouldn't consider worth their time. A little HTML/CSS can go a long way, though not usually very profitably.&lt;/p&gt;

&lt;p&gt;And don't forget you're not alone. If you get stuck on a freelance project, reach out to your alumni community. You may be surprised to discover how many Wordpress admins there are in your web-dev course's alumni base.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.codeforamerica.org/" rel="noopener noreferrer"&gt;Code for America&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;There may be a Code for America chapter in your city. If there is, and it's anything like &lt;a href="https://brigade.codeforamerica.org/brigades/Code-for-Miami/projects" rel="noopener noreferrer"&gt;the one in Miami&lt;/a&gt;, there are probably a bunch of open-source projects for you to work on. &lt;/p&gt;

&lt;p&gt;Well-meaning devs start-and-never-finish public service apps all the time. It's volunteer work, so life (e.g. paying rent) sometimes gets in the way. Nonetheless, it's still a great place to gain experience with gracious local government agencies and non-profits.&lt;/p&gt;

&lt;p&gt;If you're lucky, your project may even &lt;a href="https://thenewtropic.com/visualize-miami-dade-budget/" rel="noopener noreferrer"&gt;get press&lt;/a&gt; and attract the attention of an employer.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hackathons
&lt;/h4&gt;

&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Hackathon" rel="noopener noreferrer"&gt;hackathon&lt;/a&gt; is a time-limited competition, usually in-person (sometimes virtual), that takes place over a weekend (sometimes longer), where teams come together to quickly build apps on &lt;a href="https://hackforgood.devpost.com/" rel="noopener noreferrer"&gt;a particular theme&lt;/a&gt; or &lt;a href="https://medium.com/miabitcoinhack/miami-bitcoin-hackathon-2019-1f49e444eb74" rel="noopener noreferrer"&gt;using a particular technology&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some participate to win. If you find yourself on a good team, cash and prizes await.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/gauzBevJxeJHy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/gauzBevJxeJHy/giphy.gif" alt="cash prizes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Junior devs should be using hackathons to learn. Many companies use hackathons to &lt;a href="https://en.wikipedia.org/wiki/BattleHack" rel="noopener noreferrer"&gt;introduce or promote their products&lt;/a&gt;, so use it as an opportunity to take a guided crash course in some tech and possibly create a project to add to your portfolio. Some &lt;a href="https://developer.att.com/blog/at-amp-t-mobile-app-hackathon-miami-recap" rel="noopener noreferrer"&gt;hackathon winners&lt;/a&gt; even go on to &lt;a href="https://www.crunchbase.com/organization/whatupbridge" rel="noopener noreferrer"&gt;form startups&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More importantly, hackathons provide an opportunity for hours of networking with both highly-skilled local talent and sponsoring companies - sponsorships that are typically motivated by &lt;a href="https://challengerocket.com/knowledge-base/what-is-the-secret-of-successful-recruitments-in-paypal-hackathons.html" rel="noopener noreferrer"&gt;recruiting&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Clean Up Your GitHub
&lt;/h4&gt;

&lt;p&gt;As you work on these projects, keep your GitHub profile clean. Your &lt;br&gt;
GitHub project portfolio &lt;a href="https://anti-pattern.com/github-is-your-resume-now" rel="noopener noreferrer"&gt;may be more important than your résumé&lt;/a&gt;. Specifically, remove any half-done app repos and unnecessary forks. Make sure the projects you keep have good &lt;code&gt;README&lt;/code&gt;s describing what the code does and how to use it, particularly to a relatively non-technical audience (e.g. someone in HR at a tech company or a technical recruiter).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Job Search
&lt;/h2&gt;

&lt;h3&gt;
  
  
  You Don't Have To Know Everything To Apply
&lt;/h3&gt;

&lt;p&gt;Despite the flood of junior devs into the market, coding remains a niche skill. &lt;a href="https://www.quora.com/How-many-people-on-earth-know-computer-programming" rel="noopener noreferrer"&gt;Few people know how to do it&lt;/a&gt;. Some of what you've learned to do seems like magic to other people. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0bz09q9sllvdc08iszf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0bz09q9sllvdc08iszf.gif" alt="magic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Companies hiring devs aren't necessarily techy themselves. You may not know much, but you don't have to know everything to apply to a job. You just have to know more than the person on the other side of the interview table.&lt;/p&gt;

&lt;p&gt;You've essentially learned how to take information you found online, usually for free, and sell it to people. Use that grift to your advantage.&lt;/p&gt;

&lt;p&gt;You may not know the answer to every interview question. That's ok! Knowing the answer isn't what marks your progress. It's knowing how to find the answer that makes the difference. &lt;/p&gt;

&lt;p&gt;Your pre-code-school self didn't understand what the questions meant - tech jargon is a foreign language to non-coders. The you-of-a-few-months-ago wouldn't even know where to begin to search for answers or even recognize the answer when you found it.&lt;/p&gt;

&lt;p&gt;You don't have all the fish. But you know how to fish. You know where StackOverflow is and what it does. Most people don't.&lt;/p&gt;

&lt;p&gt;No matter your seniority level, &lt;a href="https://overreacted.io/things-i-dont-know-as-of-2018/" rel="noopener noreferrer"&gt;there will always be things you don't know&lt;/a&gt;. Not knowing the answer isn't your bootcamp's fault. Not knowing how to find the answer is.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Product Of You
&lt;/h3&gt;

&lt;p&gt;Searching for a job is similar to building a startup. Find a problem a company has, then &lt;a href="https://hackr.io/" rel="noopener noreferrer"&gt;turn yourself into the solution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You might have to do this a few times until you find your place in the tech ecosystem. You may make a few skill-set &lt;a href="https://en.wikipedia.org/wiki/Lean_startup#Pivot" rel="noopener noreferrer"&gt;pivots&lt;/a&gt; before the &lt;em&gt;product of you&lt;/em&gt; &lt;a href="https://en.wikipedia.org/wiki/Product/market_fit" rel="noopener noreferrer"&gt;is validated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But that's ok. Every new line of code you write still counts, even if you don't use all those skills in your next job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discover For Yourself
&lt;/h3&gt;

&lt;p&gt;There are companies hiring coders who have never heard of coding bootcamps. Of the companies in-the-know, some don't recognize your particular school.&lt;/p&gt;

&lt;p&gt;Your city's entire tech scene didn't attend your demo day. The few that did don't represent your entire local tech ecosystem. Don't expect them to notify other companies about your awesome presentation.&lt;/p&gt;

&lt;p&gt;Your school isn't going to hand you a list of &lt;em&gt;every&lt;/em&gt; potential employer in your city at graduation. They may not even be able to. The companies that need your skills may not be on anyone's radar yet. &lt;/p&gt;

&lt;p&gt;Get out there and find them. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26uf2JNnIwuekP3Y4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26uf2JNnIwuekP3Y4/giphy.gif" alt="exploring"&gt;&lt;/a&gt;&lt;/p&gt;
Is that a... job?



&lt;h3&gt;
  
  
  Check The Local Tech News
&lt;/h3&gt;

&lt;p&gt;Around a decade ago I learned about a company that had just won some local tech business award. They weren't well known. They didn't even have any open positions posted. But I introduced myself anyway. And I got that job.&lt;/p&gt;

&lt;p&gt;Companies make news because they want attention, both from investors and talent. Check your local tech news daily to find companies that may be open to considering you.&lt;/p&gt;

&lt;p&gt;Focus on &lt;a href="https://www.formds.com/" rel="noopener noreferrer"&gt;businesses that have just raised funding&lt;/a&gt;. Investment doesn't go to companies that just want to sustain. It goes to ventures that want to grow, which usually includes growing a team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network Like A Stalker
&lt;/h3&gt;

&lt;p&gt;Your local tech scene may seem intimidating and unwelcoming to newcomers. There are many events on Meetup and Eventbrite, but you may not be familiar with all the tech jargon in the descriptions. &lt;/p&gt;

&lt;p&gt;Find the courage to attend anyway. Go with a group of your fellow classmates if necessary. Because being on the guest list has advantages.&lt;/p&gt;

&lt;p&gt;You may be granted access to the &lt;em&gt;other&lt;/em&gt; names on the attendee list. Scan it for interesting people, both before and after the event. Add them to your target list.&lt;/p&gt;

&lt;p&gt;Focus on meeting people who work at the companies you're interested in.&lt;/p&gt;

&lt;p&gt;Then stalk your prey, which I mean in the nicest possible way!&lt;/p&gt;

&lt;p&gt;Specifically, every time one of your targets attends a networking event, try to be there, find them, and say "hello".&lt;/p&gt;

&lt;p&gt;Connect with them on LinkedIn, Twitter, and Facebook. Join every meetup that they've joined. Monitor event attendee lists. Then keep showing up, over and over. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fgiphygifs.s3.amazonaws.com%2Fmedia%2FliO87xx9T1O4U%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fgiphygifs.s3.amazonaws.com%2Fmedia%2FliO87xx9T1O4U%2Fgiphy.gif" alt="What a coincidence!"&gt;&lt;/a&gt;&lt;/p&gt;
What a coincidence bumping into you again!



&lt;p&gt;If you've already applied for a job at that company, make it impossible for them to &lt;a href="https://en.wikipedia.org/wiki/Ghosting_(relationships)" rel="noopener noreferrer"&gt;ghost&lt;/a&gt; your application. &lt;/p&gt;

&lt;p&gt;Make them want you on their team even if they can't yet think of a role for you yet. Be persistent.&lt;/p&gt;

&lt;p&gt;Just &lt;em&gt;don't be creepy about it&lt;/em&gt;. Don't show up at someone's wedding uninvited. Keep to networking events and respect boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steal Someone Else's Job
&lt;/h3&gt;

&lt;p&gt;The tech job meant for you might not look like what you expect. &lt;/p&gt;

&lt;p&gt;There are people who get paid to enter data into forms and spreadsheets all day - the &lt;em&gt;copy-pasters&lt;/em&gt;. Some people get paid to communicate - make phone calls, write emails and text messages, schedule appointments, etc.&lt;/p&gt;

&lt;p&gt;There are many jobs that can be made easier, even obsolete, with the right app, especially if you have the skills to use and customize the software.&lt;/p&gt;

&lt;p&gt;Steal those jobs, build those apps (or &lt;a href="https://www.producthunt.com/" rel="noopener noreferrer"&gt;discover them online&lt;/a&gt;), and replace those people. &lt;/p&gt;

&lt;p&gt;When you're done, refer your newly unemployed former coworkers to your coding program to be trained for the new tech economy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take The Interview
&lt;/h3&gt;

&lt;p&gt;Just take the interview. &lt;/p&gt;

&lt;p&gt;You'll never know everything a company wants. Companies understand there's no such thing as a "perfect candidate".&lt;/p&gt;

&lt;p&gt;Instead be a "perfecting candidate". If an employer wants you to learn something new, create a training plan for yourself. Make a list of all the resources you'll use to ramp up, both before and on-the-job. Include not only online training courses, but also people or Slack communities you'll reach out to for help, including your school's alumni.&lt;/p&gt;

&lt;p&gt;Just take the interview.&lt;/p&gt;

&lt;p&gt;Take it, not because you're ready, but because it shows respect. The people who work at companies are human. They can get hurt feelings if you turn down an interview request because you're "not ready yet". And making a company feel bad is a quick path to rejection.&lt;/p&gt;

&lt;p&gt;Just take the interview.&lt;/p&gt;

&lt;p&gt;Take it even if you don't want the job. Make it an &lt;a href="https://en.wikipedia.org/wiki/Informational_interview" rel="noopener noreferrer"&gt;informational interview&lt;/a&gt;. Find out what skills they're looking for and learn about the company culture. Add your name to the applicant pool. A quick introduction will give you an advantage if you later change your mind.&lt;/p&gt;

&lt;p&gt;Just take the interview.&lt;/p&gt;

&lt;p&gt;The worst that can happen is you don't get a job you want. But the interview experience is still valuable.&lt;/p&gt;

&lt;p&gt;Find out why the company didn't select you. Or ask someone who works there, staff from your school, or an alum to find out for you. &lt;/p&gt;

&lt;p&gt;Then focus your learning on those missing skills to improve your chances for the next opportunity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Gripe About Your Bootcamp In Interviews
&lt;/h3&gt;

&lt;p&gt;Given the tremendous growth in the tech-education industry, bad bootcamps are to be expected. They all get bad reviews, but some get more than others.&lt;/p&gt;

&lt;p&gt;However, saying "My school sucks, but I'm still a good hire" is not a winning interview strategy.&lt;/p&gt;

&lt;p&gt;I'm not saying don't write a bad review or share your story with other prospective applicants. Please continue to do that. It helps.&lt;/p&gt;

&lt;p&gt;I'm saying that a job interview isn't the place to vent your frustrations about your training.&lt;/p&gt;

&lt;p&gt;First, complaining about your training is similar to complaining about previous employers. If you're hired and later leave, the company may assume you'll complain about &lt;em&gt;them&lt;/em&gt; at your next gig. That underlying "bad feeling about this" can be enough to bomb your hiring chances.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/MI058ZHZq2ydy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/MI058ZHZq2ydy/giphy.gif" alt="Star Wars Gif - Bad Feeling About This"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, you're hurting your classmates. A school's reputation is built on its alumni. Coding bootcamps don't produce curriculum. They produce junior devs. You are the product. What you do reflects on the entire program.&lt;/p&gt;

&lt;p&gt;By complaining about your bootcamp in an interview, you're hurting the school's reputation and, more importantly, hurting the employment prospects of any classmates who don't share your opinion.&lt;/p&gt;

&lt;p&gt;Instead, if you found your training lacking in some way, talk positively about all the things you did to make up for it. It's ok to sell yourself as a better candidate than your classmates. It's not ok to sell yourself as better than the school itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Run Away From Your Past
&lt;/h3&gt;

&lt;p&gt;Unlike college, most coding bootcamp students don't attend straight from high school. Many are career-switchers. Some may even have a prior non-technical degree.&lt;/p&gt;

&lt;p&gt;But even if your old job was working retail or bussing tables, don't run away from your past. Career-switching coders are good &lt;em&gt;because&lt;/em&gt; of where they came from, not &lt;em&gt;in spite&lt;/em&gt; of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26ybvnES6vObYxzJS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26ybvnES6vObYxzJS/giphy.gif" alt="Beyonce - merge the past and the future"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't hide your old career. Those skills still count - they may be transferable.&lt;/p&gt;

&lt;p&gt;Specialized coders are valuable. There are lots of med-tech companies who want to hire former pharmacists or medical billing specialists. Restaurant and hospitality-tech may appreciate a former cook or waiter who now knows how to code. Pitch yourself as a combination of your old life with your new skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take The Job
&lt;/h3&gt;

&lt;p&gt;The phrase "unemployed coder" is an oxymoron. If you can code, there should be a job out there for you.&lt;/p&gt;

&lt;p&gt;But "underemployed coder" is quite common. There might not be a full-time position open for you at this time. &lt;/p&gt;

&lt;p&gt;However, there &lt;em&gt;are&lt;/em&gt; many small gigs available. There's always someone willing to pay you to make things happen on the &lt;em&gt;magic mystery machine&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Z7IRy689Jjlvi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Z7IRy689Jjlvi/giphy.gif" alt="please keep my website updated"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's not to say full-time is necessarily better than freelancing. There are plenty of crappy FT jobs too.&lt;/p&gt;

&lt;p&gt;But there are no "dead end" coding jobs. Because, as a junior, every line of code you write levels you up. Even the worse junior dev gig is still getting paid to learn, which is a step up from paying to learn at a bootcamp. And that learning, even in poor circumstances, opens up new opportunities.&lt;/p&gt;

&lt;p&gt;So take whatever job you can find and start building experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  What if I don't like any of the jobs I'm being offered?
&lt;/h4&gt;

&lt;p&gt;A bad job isn't a life sentence. You can leave whenever you want. And, if the environment is toxic, you should ASAP.&lt;/p&gt;

&lt;p&gt;But if you're just mildly unhappy with your new role, keep at it, while continuing to search for a new gig on your off time. Keep looking for something better even if you've just accepted the offer.&lt;/p&gt;

&lt;p&gt;I've heard from many new devs who balk at the idea of leaving a job too soon after starting. They feel disloyal - like it'll appear on their "permanent record". Or like they're cheating on a spouse. So they "stick it out" way past a job's natural expiration date.&lt;/p&gt;

&lt;p&gt;But a job isn't a marriage. &lt;a href="https://en.wikipedia.org/wiki/At-will_employment" rel="noopener noreferrer"&gt;You really can leave whenever you want for almost any reason.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, if it's not too much trouble, keep at it. If you don't enjoy the job, it'll only take a few months of experience to unlock better opportunities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ignore Job Titles
&lt;/h3&gt;

&lt;p&gt;In the future, the way we talk about coding will sound weird. It'll be an assumed part of basic literacy.&lt;/p&gt;

&lt;p&gt;For example, saying "I learned how to code! Now I want a job as a coder." is going to sound like "I learned how to write! Now I want a job as a writer." Almost every job requires some writing skill, regardless of whether the word "writer" appears in your job title.&lt;/p&gt;

&lt;p&gt;We've already seen it happen with basic computer skills. Even auto mechanics use a computer to order parts these days.&lt;/p&gt;

&lt;p&gt;We're beginning to see it happen with coding skills. Many administrative jobs now have a "Nice to Have" section for things like basic web design skills, HTML/CSS, or even WordPress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3lxorVGdIG3LB8xRsH/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3lxorVGdIG3LB8xRsH/giphy.gif" alt="Doctor Who gif - witchfinder's assistant"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may officially be called an "office administrator" or work in marketing or sales. But being able to, for example, keep the company's website up-to-date gives you an advantage. You're more productive than the coding illiterate masses.&lt;/p&gt;

&lt;p&gt;Someday those "nice to have"s will turn into requirements. Later they'll just be assumed of any computer-literate applicant.&lt;/p&gt;

&lt;p&gt;You're ready for that future now. Don't be afraid to take those jobs. As long as you're coding, even just a little, you're improving, even if your job title doesn't contain the words "coder", "developer", or "engineer".&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Call Yourself Junior
&lt;/h3&gt;

&lt;p&gt;A few months (even years) into a job many alums still refer to themselves as "junior". Stop doing that. Just tell potential employers your experience and let them decide where you stand at the company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Imposter Syndrome
&lt;/h2&gt;

&lt;p&gt;Imposter syndrome is real. Everyone has it, even senior devs. But for newly-minted coders, it's particularly acute. You'll feel, even after finishing the course, what the critics have always argued about coding bootcamps: that a few months (or however long your course was) isn't enough to prepare you for a job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Ek4CjGmXbiCK4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Ek4CjGmXbiCK4/giphy.gif" alt="imposter squirrel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But don't let feeling like a phony get in the way of your career. Confidence, particularly during an interview, can make a difference. &lt;/p&gt;

&lt;p&gt;You may not think you're ready, but you're better than you think you are. Here are some tips to help you overcome imposter syndrome.&lt;/p&gt;

&lt;h3&gt;
  
  
  You're The Best Class Ever
&lt;/h3&gt;

&lt;p&gt;If your school is doing its job, the most recent graduating class should be the best one ever.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26BRAAD8Cm3fPZn20/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26BRAAD8Cm3fPZn20/giphy.gif" alt="we the best, like yes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, you should have the largest alumni network of any prior graduating class. That network should include people with influence on hiring decisions who will vouch for you. &lt;/p&gt;

&lt;p&gt;Your network should also be well-known. Potential employers should understand that, by hiring you, they're also hiring the alumni who support you. You should never feel stuck or alone on the job.&lt;/p&gt;

&lt;p&gt;Second, you should be the best-trained class ever. Good coding bootcamps improve the curriculum between every cohort. You should have learned topics that previous alumni were never exposed to. That gives you an advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Worry About The Skills You Don't Have
&lt;/h3&gt;

&lt;p&gt;Computers aren't magic. They are simple machines that go very fast.&lt;/p&gt;

&lt;p&gt;You know how to use the hammer. Don't worry so much about whether the hammer is metal or wooden, long or short, heavy or light.&lt;/p&gt;

&lt;p&gt;If you've learned, for example, Ruby, it's actually not a big leap to switch to Python, .NET, or Java. Many languages look the same (i.e. almost all of them look like C).&lt;/p&gt;

&lt;p&gt;Once you've got some programming fundamentals down, you &lt;em&gt;can&lt;/em&gt; figure out the rest as you go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/5UEAAn02o9I3BULWJV/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/5UEAAn02o9I3BULWJV/giphy.gif" alt="you're a grown woman, figure it out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Talk To People Outside The Tech Bubble
&lt;/h3&gt;

&lt;p&gt;If you ever need a confidence boost, try talking to some of your non-tech friends and family about what you've learned. If they stare at you like you're speaking a foreign language, then you must have learned &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then imagine competing against those people for a tech job. (Because, sometimes, &lt;a href="https://blog.codinghorror.com/why-cant-programmers-program/" rel="noopener noreferrer"&gt;that's actually what's happening&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Let The Haters Discourage You
&lt;/h3&gt;

&lt;p&gt;People are going to stand in the way of your new career.&lt;/p&gt;

&lt;p&gt;Devs with multi-year CS degrees may be jealous you got a job after a few months of training.&lt;/p&gt;

&lt;p&gt;Employers may take advantage of you during salary negotiations because you're new to the industry.&lt;/p&gt;

&lt;p&gt;Devs who use other technologies are going to disrespect the tech stack you learned.&lt;/p&gt;

&lt;p&gt;Haters gonna hate. Don't let them win. They're all just trying to overcome their own imposter syndromes. They're pushing you down to lift themselves up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/lxdwSBJEGqLjq/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/lxdwSBJEGqLjq/giphy.gif" alt="haters gonna hate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Imposter Syndrome Will Not Be Defeated
&lt;/h3&gt;

&lt;p&gt;No amount of advice can conquer imposter syndrome. Even if you power through all your anxiety to successfully land a job, you'll still live in fear of being fired every day - as if, at any moment, they'll discover your "true identity".&lt;/p&gt;

&lt;p&gt;So my last bit of advice is based on my anecdotal experience with alumni who have been let go from companies. Usually, they don't get fired because they can't code. &lt;/p&gt;

&lt;p&gt;Companies understand they have to invest time in juniors to ramp them up. What they don't like to see is when a new hire stops caring - when they get so frustrated that they stop asking for help and quit improving themselves. That's the most efficient path to the exit.&lt;/p&gt;

&lt;p&gt;Since imposter syndrome can't be defeated, you have to fight it every day. You fight it by continuously and incrementally improving yourself, whether it's through online learning or simply asking for support from your teammates or community.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imposter Syndrome Honorable Mentions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learnpythonthehardway.org/python3/advice.html" rel="noopener noreferrer"&gt;Advice from an Old Programmer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/Xt5qpbiqw2g" rel="noopener noreferrer"&gt;The myth of the “Real JavaScript Developer” – Brenna O'Brien / Front-Trends 2016&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The coding bootcamp you just finished isn't the end. Don't think of it as a goodbye. Think of it as an orientation for the rest of your career. &lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;

</description>
      <category>jobs</category>
      <category>codingbootcamps</category>
      <category>career</category>
      <category>impostersyndrome</category>
    </item>
    <item>
      <title>Teaching Functional Programming: Two Big Picture Approaches</title>
      <dc:creator>Ed Toro</dc:creator>
      <pubDate>Tue, 06 Nov 2018 19:09:14 +0000</pubDate>
      <link>https://dev.to/eddroid/teaching-functional-programming-two-big-picture-approaches-3nli</link>
      <guid>https://dev.to/eddroid/teaching-functional-programming-two-big-picture-approaches-3nli</guid>
      <description>&lt;p&gt;Functional Programming (FP) has been around just as long, if not longer than, Object-Oriented Programming (OOP).  But it's only (relatively) recently gaining in popularity, particularly in the JavaScript community. Why?&lt;/p&gt;

&lt;p&gt;I went to MIT in the early 00's. &lt;a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html" rel="noopener noreferrer"&gt;Structure and Interpretation of Computer Programs (SICP - &lt;em&gt;sick-pee&lt;/em&gt;)&lt;/a&gt; was my textbook. So my first formally-taught programming language &lt;a href="https://en.wikipedia.org/wiki/Scheme_(programming_language)" rel="noopener noreferrer"&gt;was functional&lt;/a&gt;. Then I worked in industry for over a decade and hardly ever thought about FP. Now I'm shocked to learn that the textbook from college I don't remember very well anymore is considered the &lt;a href="https://www.reddit.com/r/csharp/comments/7pw5mk/can_anyone_recommend_a_book_for_functional/dsklg5s/?st=jo0j3dck&amp;amp;sh=810c43d5" rel="noopener noreferrer"&gt;"functional programming bible"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Don't get me wrong. It's a good textbook. I'm sure it made me a better programmer. But FP wasn't something I applied very often in my Java/ActionScript/PHP/Python/Ruby/JavaScript career. OOP patterns dominated.&lt;/p&gt;

&lt;p&gt;Then I taught at &lt;a href="https://wyncode.co/" rel="noopener noreferrer"&gt;Wyncode Academy&lt;/a&gt; for four years and found myself trying to explain some FP concepts to newcomers. In a world dominated by OOP, it's hard to explain FP. It's so &lt;em&gt;different&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After learning OOP, why is FP so much harder?&lt;/p&gt;

&lt;p&gt;Related questions: Why has it taken so long for FP to catch on? Why aren't I talking about techniques for learning OOP in an FP-dominated world?&lt;/p&gt;

&lt;p&gt;We in the coding community need to grapple with why the OOP-&amp;gt;FP transition is so hard to teach. &lt;a href="http://degoes.net/articles/fp-is-not-the-answer" rel="noopener noreferrer"&gt;Evangelizing FP like a religion&lt;/a&gt; repeats &lt;a href="http://wingolog.org/archives/2009/03/24/international-lisp-conference-day-two" rel="noopener noreferrer"&gt;the same mistakes&lt;/a&gt; that caused FP to languish in the industry for so long. &lt;/p&gt;

&lt;p&gt;Many introductions to FP are missing something. It's not just an alternative programming style. It's a new way of thinking. When introducing something big and new to my students, I try to ease them into it. These same tricks may also work with more experienced programmers from OOP backgrounds.&lt;/p&gt;

&lt;p&gt;One of the techniques I used at Wyncode to get a running start into a hard concept is storytelling. If I can get my students to understand the context - the &lt;em&gt;big picture&lt;/em&gt; - I find it easier to later explain the technical details.&lt;/p&gt;

&lt;p&gt;So here are two big-picture strategies for introducing FP - particularly to an OOP audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Big Picture 1: History
&lt;/h2&gt;

&lt;p&gt;Sometimes it's good to start from the beginning: &lt;em&gt;How does a computer work?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The most common (popular? easy-to-understand?) model of computing is the &lt;a href="https://turingmaschine.klickagent.ch/einband/#1_+_1" rel="noopener noreferrer"&gt;Turing Machine&lt;/a&gt;. The &lt;em&gt;state&lt;/em&gt; that FP programmers complain about is staring us right in the face in a Turing Machine. An algorithm for operating this machine represents transitions between different states, e.g. from some boxes being &lt;em&gt;on&lt;/em&gt;/&lt;em&gt;off&lt;/em&gt;  (1 or 0) to some other boxes being &lt;em&gt;on&lt;/em&gt;/&lt;em&gt;off&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/E3keLeMwfHY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=E3keLeMwfHY" rel="noopener noreferrer"&gt;If we try to imagine two Turing Machines operating on the same section of tape at the same time&lt;/a&gt;, we can begin to understand why "shared state" and concurrency in OOP are hard problems. But that's a post for another time.&lt;/p&gt;

&lt;p&gt;The Turing Machine is a &lt;em&gt;universal machine&lt;/em&gt;. It can be used to solve every solvable (&lt;em&gt;effectively calculable&lt;/em&gt;) math and logic problem. This simple collection of operations - move left, move right, write a dot, read a dot, erase a dot - are enough (given enough time and resources) to tackle every math problem in the universe. &lt;a href="https://en.wikipedia.org/wiki/Turing_machine" rel="noopener noreferrer"&gt;That's what Alan Turing proved in 1936&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In many ways, a Turing Machine is how a computer "works".&lt;/p&gt;

&lt;p&gt;But this is also how a computer works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtlrcdlidbw34n3bij8a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtlrcdlidbw34n3bij8a.gif" alt="full adder circuit" width="1024" height="1024"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Adder_(electronics)" rel="noopener noreferrer"&gt;A full adder circuit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a circuit for addition. It's the kind of component found inside the CPU of a computer.&lt;/p&gt;

&lt;p&gt;This is not a Turing Machine. It's not universal. It's just addition. It can't (easily) be "reprogrammed".&lt;/p&gt;

&lt;p&gt;There's also no Turing-machine-like "state". Apply voltage to the inputs corresponding to the numbers-to-add and detect voltages in the outputs corresponding to the sum. As soon as the voltage is shut off, the answer goes away. There's no "tape" sitting around to read or manipulate. Two circuits can't operate on the same logic gates simultaneously. (I don't &lt;em&gt;think&lt;/em&gt; they can, but I'm sure someone will comment to prove me wrong.)&lt;/p&gt;

&lt;p&gt;This circuit is also fast. While a classic Turing Machine flips 1s and 0s back-and-forth on some medium, this circuit operates at the speed of electricity through a wire. There are no moving parts.&lt;/p&gt;

&lt;p&gt;A circuit is a different model of computation. Each of the logic gates (AND, OR, NAND, NOR, XOR, etc.) are pure functions. They accept inputs and produce outputs with no side-effects. If all we have is the ability to create and combine these "functions", we can also solve every solvable math problem in the universe. &lt;a href="https://en.wikipedia.org/wiki/Lambda_calculus" rel="noopener noreferrer"&gt;That's what Alonzo Church proved, also in 1936&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So we've got two different models of computing: the Turing Machine's little boxes of 0s and 1s (objects) and Alonzo's Church's lambda calculus built out of logic gates (functions). Which one is correct?&lt;/p&gt;

&lt;p&gt;For a time there was a debate about whether an abstract Turing Machine could solve the same set of math problems as lambda calculus (and vice versa). Eventually they were &lt;a href="https://stackoverflow.com/questions/43830085/what-it-means-lambda-calculus-is-equivalent-to-turing-machine" rel="noopener noreferrer"&gt;proven to be&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis" rel="noopener noreferrer"&gt;equivalent&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Being equivalent means that they're equally powerful. Any algorithm that can be written for a Turing Machine can also be written using functions. So any program that can be written in Turing Machine software can also be represented in circuitry hardware.&lt;/p&gt;

&lt;p&gt;What does it mean to "program in hardware"?&lt;/p&gt;

&lt;p&gt;We can see "hardware programming" embodied in &lt;a href="https://en.wikipedia.org/wiki/Application-specific_integrated_circuit" rel="noopener noreferrer"&gt;Application-specific Integrated Circuits (ASICs)&lt;/a&gt;. Circuits can be created that are "programmed" to do one thing very quickly, like &lt;a href="https://www.digitaltrends.com/computing/what-is-an-asic-miner/" rel="noopener noreferrer"&gt;mine Bitcoin&lt;/a&gt; or &lt;a href="https://www.extremetech.com/computing/76552-project-deep-blitz-chess-pc-takes-on-deep-blue/2" rel="noopener noreferrer"&gt;play chess&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since the proposal of the &lt;a href="https://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis" rel="noopener noreferrer"&gt;Church-Turing Thesis&lt;/a&gt;, we've had two programming options. Hardware is faster and software is slower. Make a mistake in software? Just hit the delete key and try again. Make a mistake in hardware? It's time to grab a soldering iron. It's a classic engineering design trade-off.&lt;/p&gt;

&lt;p&gt;So let's say we have an algorithm written in an OOP style that we'd like to convert into an ASIC. It's probably a good strategy to rewrite the program in a FP style so it better maps to the circuit diagram's domain. Most programming languages are flexible enough to do that, but some are better at it others.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Elixir pipes&lt;/span&gt;
&lt;span class="s2"&gt;"1"&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Kernel&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# returns 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many FP-oriented languages tend to look like circuits. Specifically the "pipe operators" in &lt;a href="https://en.wikipedia.org/wiki/Pipeline_(Unix)" rel="noopener noreferrer"&gt;Unix&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Elixir_(programming_language)" rel="noopener noreferrer"&gt;Elixir&lt;/a&gt;, &lt;a href="https://blogs.msdn.microsoft.com/chrsmith/2008/05/09/f-in-20-minutes-part-ii/" rel="noopener noreferrer"&gt;F#&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Pipeline_operator" rel="noopener noreferrer"&gt;JavaScript (maybe someday)&lt;/a&gt; and others make code look like a circuit diagram: inputs go into the left, flow through a number of "gates" (pipes) until they're transformed into the final output on the right. It's probably not a coincidence that the pipe operator used by some languages (&lt;code&gt;|&amp;gt;&lt;/code&gt;) looks like a logic gate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbdbvmc9l7vkdign99ey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbdbvmc9l7vkdign99ey.png" alt="NOT logic gate" width="100" height="50"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Inverter_(logic_gate)" rel="noopener noreferrer"&gt;The &lt;code&gt;NOT&lt;/code&gt; gate&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Putting my coding instructor hat back on, a good "big picture" way of introducing FP is to start by talking about how circuits work, how they can be "programmed", and how we can model circuit diagrams in code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Big Picture 2: Philosophy
&lt;/h2&gt;

&lt;p&gt;I picked up a Philosophy minor with my CS degree, so one of the things I'm fascinated by is the intersection between those two fields of study. I find talking about the overlap helpful when teaching new coders, particularly those with Humanities instead of STEM backgrounds.&lt;/p&gt;

&lt;p&gt;A philosophically important concept in FP is "functional equivalence".&lt;/p&gt;

&lt;p&gt;Perhaps the best example demonstrating this equivalence is &lt;a href="https://twitter.com/tomstuart" rel="noopener noreferrer"&gt;Tom Stuart's&lt;/a&gt; great article &lt;a href="http://codon.com/programming-with-nothing" rel="noopener noreferrer"&gt;"Programming From Nothing"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stuart demonstrates how a program (specifically the ubiquitous FizzBuzz) can be written entirely out of functions. I'm not going to repeat that entire exercise here, but I am going to borrow his explanation of how numbers can be represented entirely with functions (the &lt;a href="https://en.wikipedia.org/wiki/Church_encoding" rel="noopener noreferrer"&gt;Church encoding&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Start by defining the concept of &lt;em&gt;zero&lt;/em&gt; as a function that accepts a function argument and does nothing with it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby&lt;/span&gt;
&lt;span class="no"&gt;ZERO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="c1"&gt;# does nothing&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, we can define all the natural numbers as functions that accept function arguments and call them &lt;code&gt;n&lt;/code&gt;-times.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# calls it once&lt;/span&gt;
  &lt;span class="c1"&gt;# same as "func.call()"&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="no"&gt;TWO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# calls it twice&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To test these "function-numbers", pass them a test function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;HELLO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# same as "ZERO.call(HELLO)"&lt;/span&gt;
&lt;span class="no"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;HELLO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# nothing displayed&lt;/span&gt;
&lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;HELLO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# one "hello" displayed&lt;/span&gt;
&lt;span class="no"&gt;TWO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;HELLO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# "hello" twice&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This functional-numeric representation can be hard to play around with and debug.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;ZERO&lt;/span&gt;
&lt;span class="c1"&gt;# outputs #&amp;lt;Proc:0x000055d195ae57b0@(repl):3 (lambda)&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So to make it easier to work with we can define a method that will convert these functional-numbers into the object-numbers we're used to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# convert number function into number object&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# count how many times counter is called&lt;/span&gt;
  &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 0&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 1&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;TWO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This converter creates a counting function and passes it to the numeric function. The &lt;code&gt;ZERO&lt;/code&gt; function will call it zero times, the &lt;code&gt;ONE&lt;/code&gt; function will call it one time, etc. We keep track of how many times the counter has been called to get the result.&lt;/p&gt;

&lt;p&gt;Given these function-number definitions, we can implement addition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ADD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ADD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 0&lt;/span&gt;

&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ADD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;ZERO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 1&lt;/span&gt;

&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ADD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ONE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;TWO&lt;/code&gt; calls a function twice, then &lt;code&gt;ADD[TWO, TWO]&lt;/code&gt; will return a function-number that calls its argument four times (the function-number &lt;code&gt;FOUR&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;It's a mind-bending exercise. When I get to the end of &lt;em&gt;"Programming From Nothing"&lt;/em&gt;, I get the sense that this is an interesting product of the clever application of a fundamental computer science concept, but not something I could use in my day job.&lt;/p&gt;

&lt;p&gt;And that's exactly the sense that I (and I suspect many others) have about FP in general - it's clever, but doesn't seem very useful. That feeling of unnecessary complexity is exactly the problem we need to solve if we hope to make FP techniques more popular.&lt;/p&gt;

&lt;p&gt;So a better place to start teaching FP than &lt;em&gt;Church numerals&lt;/em&gt; is &lt;a href="https://en.wikipedia.org/wiki/The_Matrix" rel="noopener noreferrer"&gt;The Matrix&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In that 1999 sci-fi film, the reality perceived by most humans is actually a simulation called "The Matrix". A few months ago &lt;a href="https://www.space.com/41749-elon-musk-living-in-simulation-rogan-podcast.html" rel="noopener noreferrer"&gt;Elon Musk suggested that this "simulation hypothesis" may be real&lt;/a&gt;, starting weeks of "Philosophy 101"-level media on the topic.&lt;/p&gt;

&lt;p&gt;What does &lt;em&gt;The Matrix&lt;/em&gt; have to do with FP?&lt;/p&gt;

&lt;p&gt;The metaphysical debate, of which the "simulation hypothesis" is but one response, is &lt;a href="https://en.wikipedia.org/wiki/Metaphysics#History_and_schools_of_metaphysics" rel="noopener noreferrer"&gt;very old&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Martin_Heidegger" rel="noopener noreferrer"&gt;mind-numbingly complicated at times&lt;/a&gt;. So my attempt to summarize it won't do it justice. But the big idea is that we have no proof that the world around us is real. Maybe there are actual objects in the world or maybe we're just &lt;a href="https://en.wikipedia.org/wiki/Brain_in_a_vat" rel="noopener noreferrer"&gt;brains in jars&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So there are at least two contradictory theories of what, for example, the number one &lt;em&gt;is&lt;/em&gt;. Is it a thing (a noun, an object) that we can interact with (touch and feel)? Or is it an action (a verb, a function), something that acts on the world, but isn't embodied?&lt;/p&gt;

&lt;p&gt;The functional-one is a &lt;em&gt;simulation&lt;/em&gt; of the number one. It's &lt;em&gt;functionally equivalent&lt;/em&gt; to the object-one, meaning it &lt;em&gt;does&lt;/em&gt; everything the object-one can do. For example, we can do arithmetic with it. &lt;/p&gt;

&lt;p&gt;But it's not really "there" in the way that objects in OOP are "there". It's a Matrix simulation. It doesn't have inherent attributes - it &lt;em&gt;isn't&lt;/em&gt; x, it just &lt;em&gt;does&lt;/em&gt; x.&lt;/p&gt;

&lt;p&gt;To pick a less abstract example, is the chair you're sitting in real or just &lt;a href="https://futurism.com/why-you-can-never-actually-touch-anything" rel="noopener noreferrer"&gt;forces pressing against your body&lt;/a&gt;? A "chair" may be a chair-object that exists in the real world or a chair-function: a (hopefully comfortable) force pushing against you with no underlying objective basis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpazjugtdwgxncocrp6cp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpazjugtdwgxncocrp6cp.jpg" alt="red delicious apple" width="325" height="220"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Red_Delicious" rel="noopener noreferrer"&gt;A red delicious apple&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Consider color. Is a red delicious apple really red (adjective describing a noun) or does it act red (verb)? Is color an inherent attribute of a real underlying apple-object or just an action that an apple-function is programmed to do when light shines on it? Is the apple real or just a simulation?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# A "real" apple&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Apple&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:color&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="vi"&gt;@color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ruby red"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;Apple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;color&lt;/span&gt; &lt;span class="c1"&gt;# "ruby red"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# A "simulated" apple&lt;/span&gt;
&lt;span class="no"&gt;APPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;applied&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"ruby red"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;applied&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"light"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;APPLE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"light"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# "ruby red"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difficulty of this philosophical concept is a good metaphor for why FP is so hard to teach in an OOP-dominated world. To help students understand, start by opening up their minds to the possibility of a world made up solely of "functions". Start with that &lt;em&gt;big picture&lt;/em&gt; concept, then transition towards FP models of the world: how they differ from OOP representations yet maintain equivalent results. Ask an experienced OOP developer to consider rewriting a &lt;code&gt;class&lt;/code&gt; into its functional equivalent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Transitioning from OOP into FP can be hard. It's not just a different programming style. It's an alternative model of the world. And the better we are at easing students into that paradigm shift, the easier it'll be to avoid another half-century of ignoring this useful tool in the coder's toolbox.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edits&lt;/em&gt;&lt;br&gt;
Writing is just as debuggable as code. So I've decided to clarify that I'm presenting teaching strategies for introducing FP to OOP-minded programmers. FP programming itself isn't hard. It's the paradigm shift that needs support.&lt;/p&gt;

</description>
      <category>functional</category>
      <category>ruby</category>
      <category>elixir</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
