-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeed.xml
More file actions
713 lines (440 loc) · 61.6 KB
/
Copy pathfeed.xml
File metadata and controls
713 lines (440 loc) · 61.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Mina Slater</title>
<description>Javascriptress | Rubyist | Nacho Monster</description>
<link>https://minaslater.blog/</link>
<atom:link href="https://minaslater.blog/feed.xml" rel="self" type="application/rss+xml" />
<pubDate>Fri, 10 Jan 2020 23:31:26 -0600</pubDate>
<lastBuildDate>Fri, 10 Jan 2020 23:31:26 -0600</lastBuildDate>
<generator>Jekyll v3.8.5</generator>
<item>
<title>Too Beginner to be a Conference Speaker? NEVER!</title>
<description><p>When I changed careers into tech, I had a mental retro about what I could’ve done better in my past career, coming to the conclusion that:</p>
<ol>
<li>I didn’t stay connected enough to the community and…</li>
<li>I found situations that were comfortable and held onto them, avoiding opportunities that challenged me.</li>
</ol>
<p>So, I made a conscious decision to do the opposite of both of those. I looked for leadership and organizing opportunities in the local tech community and identified things that I was scared of doing, and actively sought out chances to do them.</p>
<p>Public speaking topped that list. 😱</p>
<p>Fast-forward to 2019, after sending out CFPs (calls for paper, or talk proposals) here and there for a year, I got my first acceptance to a major conference, RailsConf. 🎉 It was a conference that I had wanted to go to for a couple years, where some of my Coding Heroes will be presenting, as well. Naturally, I was at the same time excited, honored and of course, terrified!</p>
<p>Spoiler alert: I survived.</p>
<p><img src="https://i.imgur.com/eYG8hAr.gif" /></p>
<p>Since RailsConf in May I have given that same talk two more times, at THAT Conference in WI and RubyConf, getting less and less terrified each time. Some folks (mostly other Code Newbies) have expressed shock that at less than 2 years in tech, I was “already” speaking at conferences. I always told them that they can too, and should.</p>
<p>Here are the reasons why.</p>
<h2 id="fresh-perspective">Fresh Perspective</h2>
<p>We bring a set of new perspective with us when we come into the tech industry. Our experiences before entering tech might inform a simpler approach to completing the task or we might ask different questions than a Senior Engineer would. While our experience might be limited, we are also not weighed down by the same indoctrination and baggage as someone who’d spent decades in the industry. CodeNewbies are inventive. We don’t have the notion of “we’ve always done it this way”; All these tools are new to us and in our attempt to manipulate computers to do complicated things, we sometimes discover new ways to use these tools that folks might not have thought of.</p>
<p>And what better place to share these discoveries than on a conference stage?!</p>
<h2 id="motivation-to-learn">Motivation to Learn</h2>
<p>When I first decided to submit a proposal for a conference talk titled “Bridging the Knowledge Gap: Debugging”, I was not good at it. Whenever I had to track down a bug, I froze. I had no idea when to use what tool.</p>
<blockquote>
<p>Should I put a <code class="highlighter-rouge">binding.pry</code> somewhere? If yes, where?</p>
</blockquote>
<p>I always forgot to look for information in error messages or server logs. My pair, if I was pair programming, always had to make suggestions and point out the next steps to me. I constantly wished that my bootcamp had taught me more about debugging.</p>
<p>The purpose of the talk, other than to get into speaking, was to pick a topic that I want to get better at or know more about. This gave me a reason and accountability to do a deep dive that I otherwise might keep putting off. I learned so much during the research phase of preparing the presentation. Now that I’ve given the talk a few times, I’m feeling more comfortable applying those tools in my daily workflow.</p>
<h2 id="professional-advancement">Professional Advancement</h2>
<p>Long before my first trip as a speaker to RailsConf, I’ve wanted to go as an attendee. I streamed the talks from the main room from afar the two years prior to 2019. I watched videos of presentations by really smart folks like <a href="https://twitter.com/tenderlove">Aaron Patterson</a>, <a href="https://twitter.com/eileencodes">Eileen Uchitelle</a> and <a href="https://twitter.com/searls">Justin Searls</a>. I always learned a lot from their talks and regarded them as “coding celebrities”.</p>
<p>Attending conferences, it’s pretty much a given that you’ll meet new people and create professional connections. Attending as a speaker takes this to a whole new level.</p>
<p>A lot of conferences host a reception or dinner for speakers at some point. The ones that I had been a part of took place the night before the first day. At these events, I was able to meet some of the people I looked up to in the Ruby community. I can say, with 100% truthfulness, that I “had dinner with DHH”, the creator of Ruby on Rails. We don’t have to talk about the fact that it was in a room of about 100 people.</p>
<p><img src="https://i.imgur.com/Md6erde.gif" /></p>
<p>My favorite interaction with one of the “coding celebrities” mentioned above was when Justin Searls tweeted about being nervous before a talk after 10 years of speaking, I replied that it was a relief to hear him say that as a first-time speaker. Then, <em>he came to my talk and complimented me afterwards</em>! 😮</p>
<p><img src="https://i.imgur.com/owHDvmu.png" width="350px" />
<img src="https://i.imgur.com/Xrh1giH.png" /></p>
<p>More than that, I have met folks who inspired and encouraged me to write more (<a href="https://dev.to/molly_struve">Molly Struve</a>), speak more (<a href="https://twitter.com/leenyburger">Colleen Schnettler</a>), take better care of myself (<a href="https://twitter.com/avdi">Avdi Grimm</a>), among others. Many of whom I also now consider friends.</p>
<h2 id="conclusion">Conclusion</h2>
<p>All that said, the best reason I have found for me to keep speaking (even though imposter syndrome runs amok) is this:</p>
<blockquote>
<p>There’s always someone working to be where you are.</p>
</blockquote>
<p>Even though I started speaking as a major stretch goal in a new career and to face my fears of public speaking, I keep doing it because I want to inspire other early-career developers to get up and speak about their learnings and experiences. Experts shouldn’t be the only voices we hear on conference stages. <strong>Representation matters.</strong></p>
<p>Now I’m going to shamelessly include a video of my first conference talk (click to play):</p>
<p><a href="https://www.youtube.com/embed/g1PxL1T4Z4s"><img src="https://i.imgur.com/RT4apqT.jpg" /></a></p>
<h2 id="resources">Resources</h2>
<p>Articles on writing proposals:<br />
<a href="http://www.noelrappin.com/railsrx/2014/3/17/what-i-learned-from-reading-429-conference-proposals">What I learned from reading 429 conference proposals</a> by Noel Rappin<br />
<a href="http://www.noelrappin.com/railsrx/2014/1/18/conference-prompts-or-how-to-submit-proposals-and-influence-people">Conference Prompts: Or How to Submit Proposals and Influence People</a> by Noel Rappin<br />
<a href="http://www.sarahmei.com/blog/2014/04/07/what-your-conference-proposal-is-missing/">What Your Conference Proposal Is Missing</a> by Sarah Mei</p>
<p>I would also recommend checking out your local <a href="https://www.writespeakcode.com/">Write/Speak/Code</a> meetups. They do a great program called Own Your Expertise that I highly recommend.</p>
</description>
<pubDate>Fri, 10 Jan 2020 00:00:00 -0600</pubDate>
<link>https://minaslater.blog/2020/01/10/conference-speaking-as-a-codenewbie/</link>
<guid isPermaLink="true">https://minaslater.blog/2020/01/10/conference-speaking-as-a-codenewbie/</guid>
<category>CodeNewbie</category>
<category>Speaking</category>
<category>Conferences</category>
<category>Twitter Thread</category>
</item>
<item>
<title>Bridge the Knowledge Gap, Debugging 3 - Print & Interactive Debugging</title>
<description><p><em>Part Three of the <strong>Bridging the Knowledge Gap</strong> Series on Debugging</em><br />
<em>Check out Part One <a href="/2019/11/24/debugging-part-one/">here</a></em>
<em>and Part Two <a href="/2019/12/09/debugging-part-two/">here</a></em></p>
<p>Learning syntax is only a small part of being a developer. The transition from coding bootcamp or online tutorials to the Real World can be a struggle. The objective of this series of blog posts is to summarize the knowledge that I gained during my own transition period (and beyond), and pay it forward to those that find themselves in a similar position.</p>
<h3 id="debugging">Debugging</h3>
<p>A reminder of the debugging topics that we will be covering:</p>
<ol>
<li>
<p><a href="/2019/11/24/debugging-part-one/}">“Look under the hood” - Print &amp; interactive debugging</a></p>
</li>
<li>
<p><a href="/2019/12/09/debugging-part-two/}">“Tap the phone line” - Network monitoring &amp; server logs</a></p>
</li>
<li>
<p>General tips</p>
</li>
</ol>
<h2 id="part-three-general-tips">Part Three: General Tips</h2>
<p>Bugs and errors are normal parts of software development, because developers are only human. We have already covered some tools that will help us debug our program. In this post, we will have a look at some approaches that have worked for me. They’re not “best practices” (what does that mean, anyway?!), just some mindsets I have picked up from my mentors and peers along the way.</p>
<h3 id="scenario">Scenario</h3>
<p>Recently, my pair Shamyle and I wrote a method to sort some ActiveRecord objects returned from a couple of queries into one list. We had one database query that returned an ActiveRecord Relation, a list of Evaluations, and another query that returned one single Evaluation. The purpose of our method was to sort these results into one list based on certain attributes, so that the frontend will display them in the proper order.</p>
<p>Something like this (shortened for reasons):</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">display_evaluations</span>
<span class="n">list_query</span> <span class="o">=</span> <span class="no">Evaluations</span><span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="o">...</span><span class="n">attributes</span><span class="p">)</span>
<span class="n">single_query</span> <span class="o">=</span> <span class="no">Evaluations</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="o">...</span><span class="n">other</span> <span class="n">attributes</span><span class="p">)</span>
<span class="n">list_query</span> <span class="o">&lt;&lt;</span> <span class="n">single_query</span>
<span class="n">list_query</span><span class="p">.</span><span class="nf">sort</span><span class="p">(</span><span class="ss">date: :desc</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>
<p>With a fully green test suite and the UI revealing no unexpected behaviors, after the team reviewed it, we merged it into the codebase.</p>
<p>A couple hours later, when Sasha was working in the QA environment, she found that the page we worked on was broken. After a little bit of investigating, she concluded that the page couldn’t render because one of those queries to the database returned nothing. Our method was adding a <code class="highlighter-rouge">nil</code> into the list of objects we pass to our frontend, but when it tried to display something that was undefined, everything fell apart.</p>
<h3 id="tip-1---write-tests">Tip #1 - Write Tests</h3>
<p>One of the first things I do when I find a bug now is write tests because we want to make sure that any future changes to the code won’t result in the same bugs again. Tests to cover the conditions under which our bugs show up will prevent that code regression and let us know when the bug has been fixed.</p>
<p>For the case above, I ended up working with her to find a solution for the bug and the first thing she suggested we do was write tests to cover this particular state of the program. Our test basically said, “hey, if one of the queries came back with no result, exclude it from the list of objects to render by not pushing it to the array we return!”</p>
<p>We didn’t know when we started debugging what specific lines of code we needed to change or what that change looked like. But backed up by the tests, we would know right away when it’s been fixed. Having comprehensive tests can also help with our next tip.</p>
<h3 id="tip-2---make-small-incremental-changes">Tip #2 - Make Small, Incremental Changes</h3>
<p>When I first started coding, I had the tendency to make (what I know now to be) wild guesses about the cause of my bugs. I would encounter something that’s broken and immediately try to fix it in the code, glossing over the error messages. In my random attempt at a solution, I might touch multiple files and methods. At the end of the flailing, the bug would either still be there or something else altogether was broken, and I would have no idea where to begin backtracking the many changes I just made. 😱</p>
<p>Tech folks like to talk about TDD (Test Driven Development) as a Best Practice. I would also define TDD as Test Driven Debugging. Regardless whether our task is to create a new feature or fix a buggy old feature, having tests gives us a roadmap to our goal.</p>
<p>Sasha and I wrote our tests, and much like with the TDDev approach, each change in code only addressed the specific way the tests were failing or a specific error we saw <em>at that moment</em>. So each time we tried a solution, we would run the tests, hoping that they would fail in new and exciting ways, informing our next step(s).</p>
<h3 id="tip-3---challenge-assumptions">Tip #3 - Challenge Assumptions</h3>
<p>Bugs exist because we think our codes works one way when it really works another way. There are things about our program that we take for granted to be true. How many times have you said something like this:</p>
<blockquote>
<p>This method returns an array of objects, so when we call it here, the other method can iterate through it.</p>
</blockquote>
<p>…only to find that the first method returns a different data structure sometimes?</p>
<p>They say that the first step to recovery is admitting that you have a problem. In order to debug efficiently, we have to admit that what we think we know about our code isn’t always true. We can begin by asking ourselves these questions:</p>
<p>🚨What do I <em>think</em> my code is doing?<br />
🚨What is my code <em>actually</em> doing? (by using some tools from Parts 1 and 2, maybe)<br />
🚨How does this disconnect cause problems in the program?</p>
<p>In the case of our example:<br />
💡I thought both of my queries would return <em>something</em>.<br />
💡…but in actuality, those queries could return nothing from the database.<br />
💡When the frontend tries to iterate through and display components for each item in the list, it doesn’t know what to do with an <code class="highlighter-rouge">undefined</code> or <code class="highlighter-rouge">null</code>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Sometimes in our jobs as developers, it feels likes we’re just putting out fire after fire.</p>
<p><img src="https://i.imgur.com/QvlRjA6.gif" width="500px" /></p>
<p>So, good debugging habits are almost as important as writing clean code.</p>
<p>In a perfect world, bootcamps would put more emphasis on teaching the techniques and practice of debugging; it would prevent their graduates from learning bad habits and prepare us better for our first jobs.</p>
<p>I’d like to go back to Aaron Patterson again here to close this talk. I found a tweet the other day, that he had pinned from back in January.</p>
<p><img src="https://i.imgur.com/i7GVEHs.png" width="500px" /></p>
<p>Knowing Tenderlove, he was probably making a joke, but this actually made me feel more at ease about debugging. Because when we frame it in this way, errors and bugs are just edge cases that we haven’t considered yet. So we shouldn’t be intimidated by them.</p>
<p>And, I hope after these three posts, you are now empowered to debug with confidence!</p>
</description>
<pubDate>Fri, 27 Dec 2019 00:00:00 -0600</pubDate>
<link>https://minaslater.blog/2019/12/27/debugging-part-three/</link>
<guid isPermaLink="true">https://minaslater.blog/2019/12/27/debugging-part-three/</guid>
<category>CodeNewbie</category>
<category>Debugging</category>
<category>Ruby On Rails</category>
<category>Basics</category>
</item>
<item>
<title>Bridge the Knowledge Gap, Debugging 2 - Network Monitoring and Server Logs</title>
<description><p><em>Part Two of the <strong>Bridge the Knowledge Gap</strong> Series on Debugging</em><br />
<em>Check out Part One <a href="/2019/11/24/debugging-part-one/">here</a></em></p>
<p>Learning syntax is only a small part of being a developer. The transition from coding bootcamp or online tutorials to the Real World can be a struggle. The objective of this series of blog posts is to summarize the knowledge that I gained during my own transition period (and beyond), and pay it forward to those that find themselves in a similar position.</p>
<h3 id="debugging">Debugging</h3>
<p>A reminder of the debugging topics that we will be covering:</p>
<ol>
<li>
<p><a href="/2019/11/24/debugging-part-one/}">“Look under the hood” - Print &amp; interactive debugging</a></p>
</li>
<li>
<p>“Tap the phone line” - Network monitoring &amp; server logs</p>
</li>
<li>
<p>General tips</p>
</li>
</ol>
<h2 id="part-two-tap-the-phone-line">Part Two: Tap the phone line</h2>
<h3 id="browser-developer-tools">Browser Developer Tools</h3>
<p>As web developers, testing features in the browser as we write code is a fairly standard practice in our typical development flow. Usually, when things aren’t working properly, we would expect to see some kind of error in the browser or Javascript console. However, oftentimes, we would be faced with an unresponsive UI or a blank screen.</p>
<p>Something that’s really useful in these cases is built right into the browser. If we open up the developer tools, we can see all these tabs. The most useful ones, from left to right, are Elements (HTML &amp; styling), Console (Javascript) and Network (server activities).</p>
<p><img src="https://i.imgur.com/Ab5tqGE.png" alt="Screencap of puppy app with the developer tools open and Elements, Console and Network highlighted" width="500px" /></p>
<p>In the Network tab, lives a log of our network activities. It shows us whether our app’s resources are being downloaded or uploaded correctly, and the status of our application’s trips to and from the server.</p>
<p>When we first open up the dev tools, we won’t see anything in the logs yet. But once the tab is open, we can reload the page or repeat the action that was problematic and watch the logs populate with all the network activities.</p>
<p><img src="https://i.imgur.com/50cTDFH.png" alt="Network tab with a 500 status request" width="500px" /></p>
<p>Each row in the table at the bottom represents an HTTP request and the column gives you more information about each of the requests. The ones that I look at most often are the name of the resources, the status, which is the HTTP response code, and the resource type.</p>
<p>Some lines will appear in red if there are bad requests, maybe a 500 internal server error or a 403 forbidden.</p>
<p>When we click into one of these lines, we have access to more details like the request and response headers, and the response body. These sections will let us look at the requests more closely. I typically check to make sure the requests are going out to server with all the information that the backend needs to properly process the request.</p>
<p>In the Headers tab under an individual request line, there’s a request payload section that will tell us what information went out to the server, and we can see whether it’s behaving as expected or identify where it’s not.</p>
<p><img src="https://i.imgur.com/KGTwIaX.png" alt="Response tab in Network that shows a 500 returned from the server" width="500px" /></p>
<p>On the flipside, there’s a Response tab that will show us what came back from the server as a result of our request.</p>
<p><img src="https://i.imgur.com/wC9X9s7.png" alt="Response tab in Network that shows a 500 returned from the server" width="550px" /></p>
<p>In this case, it looks like our request resulted in a 500 internal server error, because it raised an ArgumentError on the backend because we gave some method the wrong number of arguments.</p>
<h3 id="server-logs">Server Logs</h3>
<p>We can also look for similar information from the server-side by peeking into the server logs.</p>
<p>This is the place our backend will log information about each request coming in, how the server resolves the requests and the result. This is where exception and warnings will show up and where the Pry session will open if the program hits a breakpoint.</p>
<p>We have here the Rails server for Puppygotchi, the example app from <a href="/2019/11/24/debugging-part-one/}">Part One: Look Under the Hood</a>. This is all the information the server logged during for the same action from when we saw the network logs in the browser.</p>
<p>Like with the network tab, we can see the HTTP request and which route it hits (Box 1), the response status code (Box 2), and the exception that was raised (Box 3), which we saw in the browser returns as part of the response body.</p>
<p><img src="https://i.imgur.com/DdDAFTM.png" alt="Rails server that logs the route a request hits, the response code and any exception or error raised" width="500px" /></p>
<h3 id="takeaway">Takeaway</h3>
<p>There are a lot of more advanced ways to read both the Network tab and the server logs, and get them to even better clues on how to approach our bugs. When I was first getting started, I had a hard time even remembering to look in these places; let alone knowing what it was telling me. This is only meant to point out something that’s easy to overlook:</p>
<blockquote>
<p>Even though a bug manifests itself on the frontend doesn’t necessarily mean it’s something wrong with the frontend code.</p>
</blockquote>
<p>I wasted a lot of time looking in all the wrong places only to realize that it was actually a backend issue disguising itself as a frontend error.</p>
<p><img src="https://i.imgur.com/A3ypjb2.gif" alt="Captain Marvel drops through the ceiling of a bus to beat up an old lady" width="500px" /></p>
<p>I also recommend keep an eye on the Network tab and the server logs as a matter of practice, because it is really beneficial to be familiar with how our programs. As we can saw, the logs don’t always tell us when something is misbehaving; they mostly just tell us what is happening. The output definitely are not always color-coded, so if we know what the logs look like when it’s correct, we will be able to spot when it’s not.</p>
<p>Be patient. The more we read these logs and error messages, the easier it would be next time to spot the important things.</p>
</description>
<pubDate>Mon, 09 Dec 2019 00:00:00 -0600</pubDate>
<link>https://minaslater.blog/2019/12/09/debugging-part-two/</link>
<guid isPermaLink="true">https://minaslater.blog/2019/12/09/debugging-part-two/</guid>
<category>CodeNewbie</category>
<category>Debugging</category>
<category>Ruby On Rails</category>
<category>Early career</category>
</item>
<item>
<title>Bridge the Knowledge Gap, Debugging 1 - Print & Interactive Debugging</title>
<description><p><strong>Part One of the <em>Bridge The Knowledge Gap</em> series on Debugging</strong></p>
<p>As a Career Changer, like many others, I went through a coding bootcamp, where they taught me the very basics of building a web app. Since there is a limit to how much you can teach someone over the course of three months, compromises have to be made. Things like refactoring, testing and debugging don’t get the same attention.</p>
<p>Because of this, when I started working, I instantly discovered that there is so much I still had to learn; syntax is only a small part of it. I’m sure my experience was not that unique and a lot of bootcamp grads struggle at our first jobs because of it.</p>
<p>From that revelation the “Bridging the Knowledge Gap” series was born.</p>
<p>The objective here is to pay it forward. Even as a Beginner, I realize that there’s always someone that’s working hard to get to where I am. I can’t travel back in time and give Past Me the knowledge and skills that I have now, but hopefully I can help others narrow the gap between Bootcamp and the Real World.</p>
<h2 id="debugging">Debugging</h2>
<p>The first topic I want to cover is debugging. As developers, we spend a lot of our time navigating code that doesn’t work, and when I first started learning to code, I thought errors were telling me that I did something wrong and since we’ve all been conditioned to avoid mistakes, they felt like failures. As an attempt to avoid error messages, I just didn’t run my code as often.</p>
<p><img src="https://i.imgur.com/P0mGT1s.jpg" alt="you can't get error messages if you don't run the code meme" width="300px" /></p>
<p>Since then, I’ve learned that errors are actually my friends and picked up a few tactics for handling bugs. I’ve organized the things I learned about debugging into three main parts, each the focus for a post of their own:</p>
<ol>
<li>
<p>“Look under the hood” - Print &amp; interactive debugging</p>
</li>
<li>
<p>“Tap the phone line” - Network monitoring &amp; server logs</p>
</li>
<li>
<p>General tips</p>
</li>
</ol>
<p>These are not meant to be step by step instructions, but rather starting points where debugging can begin. Depending on the issue at hand, we can use one of the three, mix and match them, or go another route altogether.</p>
<p>This is Part 1: “Look under the hood”, covering print &amp; interactive debugging</p>
<h3 id="print-debugging">Print Debugging</h3>
<p>In Javascript, print debugging is achieved by using <code class="highlighter-rouge">console.log</code>. In Ruby, we use <code class="highlighter-rouge">print</code>, <code class="highlighter-rouge">puts</code> or <code class="highlighter-rouge">p</code>. Most of the time, we use this strategy to get a look at values of variables at runtime, compare these printouts to expectations to figure out where our code needed changing.</p>
<p><img src="https://i.imgur.com/6ypWDpK.png" alt="Ruby print methods" width="350px" /></p>
<p>All three of these do similar things: output information from our program into the console.</p>
<p>But where <code class="highlighter-rouge">print</code> and <code class="highlighter-rouge">puts</code> internally calls <code class="highlighter-rouge">to_s</code> to turn the thing we want to output into a human-readable String, <code class="highlighter-rouge">p</code> calls <code class="highlighter-rouge">inspect</code> internally, giving us more useful information.</p>
<p>For instance, let’s say we have an ActiveRecord object, a puppy named Dottie.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>irb<span class="o">(</span>main<span class="o">)</span>:001:0&gt; puppy <span class="o">=</span> Puppy.first
</code></pre></div></div>
<p><img src="https://i.imgur.com/nhQGFXi.jpg" alt="puppy in a gift bag" width="200px" /></p>
<p>Inside the Rails console here, we can see the difference between using <code class="highlighter-rouge">puts</code> to output our Puppy object (top) and using <code class="highlighter-rouge">p</code> (bottom).</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>irb<span class="o">(</span>main<span class="o">)</span>:002:0&gt; puts puppy
<span class="c">#&lt;Puppy:0x00007ff2a2449930&gt;</span>
<span class="o">=&gt;</span> nil
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>irb<span class="o">(</span>main<span class="o">)</span>:003:0&gt; p puppy
<span class="o">=&gt;</span> <span class="c">#&lt;Puppy </span>
<span class="nb">id</span>: 1,
name: <span class="s2">"Dottie"</span>,
stomach: <span class="nt">-19</span>,
bladder: 24,
bowel: 24,
bored: <span class="nb">true</span>,
created_at: <span class="s2">"2019-04-21 19:37:34"</span>,
updated_at: <span class="s2">"2019-04-28 01:06:28"</span>,
user_id: 1&gt;
</code></pre></div></div>
<p>Depending on what problems we are trying to debug at the time, we might choose one over the other.</p>
<p>Print debugging lets us leave breadcrumbs, in the form of these print statements, around our code and visually track the path of our program and look at actual pieces of data. We can watch and make sure that all the data is as expected and if an output we expected didn’t show up, it’s safe to say that our program never hit that section of code at all.</p>
<h4 id="to-summarize">To summarize:</h4>
<p>🚨 <code class="highlighter-rouge">puts</code> - Outputs a human-readable string of the object, with a new line.<br />
🚨 <code class="highlighter-rouge">print</code> - Outputs a human-readable string of the object, without a new line.<br />
🚨 <code class="highlighter-rouge">p</code> - Outputs information about that specific instance of the object.</p>
<p>Aaron Patterson is a maintainer of both Ruby and Rails, and a famously self-proclaimed puts debuggerer (<a href="https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html">link to his blog post</a>). In that post, he talks about a lot of very advanced uses for these print methods. Most of the things that he covers in the post feel very much over my head, and honestly, <code class="highlighter-rouge">p</code> and <code class="highlighter-rouge">puts</code> aren’t my favorite tools for digging into the inner-workings of my Rails application. I generally prefer interactive debugging, using a Gem called <a href="https://github.com/pry/pry">Pry</a>.</p>
<h3 id="interactive-debugging">Interactive Debugging</h3>
<p><img src="https://i.imgur.com/Eid2Ij2.png" alt="Pry logo" width="200px" /></p>
<p>Pry allows us to open up a console session at any given point of our program, just by dropping the line <code class="highlighter-rouge">binding.pry</code> into the parts of the code we want a closer look at. Now when we run the program again, it would pause there and give us an interactive console in the terminal. It serves largely the same purpose as using the print methods, but Pry, gives us more freedom.</p>
<p>Here is an app I built years ago to teach myself Rails, called <a href="https://github.com/minaslater/Puppygotchi">Puppygotchi</a>. The puppies get hungry or bored over time so Users can log in to feed or play with them.</p>
<p>I have put a couple of breakpoints in the service object that ages the puppies and reset their hunger and boredom level. We also have a few private methods that are folded at the bottom.</p>
<p><img src="https://i.imgur.com/Vh1T9gK.png" alt="code snippet with binding.pry" width="200px" /></p>
<p>If we run the program by reloading the page in the browser, the load would catch and appear to be unresponsive. But, over in our server, we can see the request from the reload hit the server and stop at our first <code class="highlighter-rouge">binding.pry</code></p>
<p><img src="https://i.imgur.com/1VWVCsF.png" alt="pry session at breakpoint" /></p>
<p>Most things we can do in the Rails console are available in a Pry session, such as <code class="highlighter-rouge">ls</code>.</p>
<p>Using <code class="highlighter-rouge">ls</code>, we can get an overview of everything that is available to us within the current context, <code class="highlighter-rouge">PuppyAgingService</code>.</p>
<p><img src="https://i.imgur.com/VWrMVsG.png" alt="pry context output for puppy aging service object" /></p>
<p>We can see from the output of our this command that the PuppyAgingService has a public instance method, <code class="highlighter-rouge">process</code>, but it doesn’t show me the private methods, because I don’t have access to them from within Pry.</p>
<p>My projects generally couple a gem called <a href="https://github.com/deivid-rodriguez/pry-byebug">pry-byebug</a> with Pry, which gives us commands to navigate through the codebase. The ones I most commonly use are <code class="highlighter-rouge">next</code>, <code class="highlighter-rouge">step</code> and <code class="highlighter-rouge">continue</code>.</p>
<p>So, we’re still pry’d into the <code class="highlighter-rouge">initialize</code> method in PuppyAgingService here. We are stopped on line 4, and we can tell because of the arrow on the left of the line number. That line of code is telling our <code class="highlighter-rouge">@puppy</code> instance variable to point to the puppy object we passed in when initializing the PuppyAgingService and right now, it hasn’t been executed yet. If we look at our instance variable <code class="highlighter-rouge">puppy</code>, it has no value right now; it’s <code class="highlighter-rouge">nil</code>.</p>
<p><img src="https://i.imgur.com/VOHsvtB.png" alt="@puppy with nil output" /></p>
<p>But if we use the <code class="highlighter-rouge">next</code> command, the program will run the next line, assign the value of <code class="highlighter-rouge">@puppy</code> variable and stop at line 5.</p>
<p>We can then see <code class="highlighter-rouge">@puppy</code> has a value now.</p>
<p><img src="https://i.imgur.com/nKCvdHj.png" alt="output of next command in console" /></p>
<p>Then, let’s say we want to know how the method <code class="highlighter-rouge">change_time</code> works, we can use the <code class="highlighter-rouge">step</code> command to step into this next method call. This will land us inside the declaration of a private method defined on the PuppyAgingService class.</p>
<p><img src="https://i.imgur.com/5ZakyKF.png" alt="step command steps into next method call, change_time" /></p>
<p>The last navigation command I want to demonstrate is <code class="highlighter-rouge">continue</code>, which will tell Pry to continue running the program until it hits the next breakpoint, which remember we have in the instance method, <code class="highlighter-rouge">process</code>.</p>
<p><img src="https://i.imgur.com/ZnQG1E8.png" alt="continue command gets to next breakpointinto private method" /></p>
<p>And when we’re done with the session and want our program to carry out the rest of the actions, we can use <code class="highlighter-rouge">exit</code> to get out of the Pry session.</p>
<p><img src="https://i.imgur.com/sF8fWzL.png" alt="exit command exits pry session" /></p>
<h4 id="to-summarize-1">To summarize:</h4>
<p>🚨 <code class="highlighter-rouge">next</code> - runs the next line in the program.<br />
🚨 <code class="highlighter-rouge">step</code> - steps into the declaration of the next method called.<br />
🚨 <code class="highlighter-rouge">continue</code> - runs the program until the next breakpoint.<br />
🚨 <code class="highlighter-rouge">exit</code> - gets out of the Pry session.<br />
🎁 Bonus! 🚨 !BONUS!<code class="highlighter-rouge">whereami</code> - tells us where the Pry session is currently.</p>
<h3 id="use-case">Use Case</h3>
<p>If you’ve ever built a Rails project, you’ve seen this error before:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined</span> <span class="nb">method</span> <span class="s1">'select'</span> <span class="k">for</span> <span class="kp">nil</span><span class="ss">:NilClass</span>
</code></pre></div></div>
<p>This message is telling us that the code wants to invoke a method, <code class="highlighter-rouge">select</code>, on something whose value is <code class="highlighter-rouge">nil</code>.</p>
<p>In this example, <code class="highlighter-rouge">select</code> is a Ruby built-in method on the Array and Enumerable classes, so if the object it’s being called on is anything but an instance of either class, the method call results in this error. It’s the message we’ll see every time we try to use a method on something has the incorrect data type. Since there are many answers for where, how and why the data is unexpectedly <code class="highlighter-rouge">nil</code>, opening up the program using <code class="highlighter-rouge">puts</code> or Pry is a decent place to start this debugging process. We can use these tools to identify the problem spots and follow the clues from there to the solution.</p>
<p>Being able to peek under the hood of my program was a game-changer! For me, the hardest part of learning to code was overcoming the disconnect between the text in the files and what shows up in the browser. It’s especially hard to conceptualize when working with a dynamically typed language like Ruby, where we can assign data of any type to the same variable without any warning about potential problems.</p>
<h3 id="resources">Resources</h3>
<p><a href="https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html">I am a puts debuggerer</a> by Tenderlove</p>
<p><a href="https://github.com/deivid-rodriguez/pry-byebug">pry-byebug docs</a></p>
</description>
<pubDate>Sun, 24 Nov 2019 00:00:00 -0600</pubDate>
<link>https://minaslater.blog/2019/11/24/debugging-part-one/</link>
<guid isPermaLink="true">https://minaslater.blog/2019/11/24/debugging-part-one/</guid>
<category>CodeNewbie</category>
<category>Debugging</category>
<category>Ruby On Rails</category>
<category>Rails Basics</category>
</item>
<item>
<title>Imposter Syndrome - Feels Not Reals</title>
<description><p>Originally published on the <a href="https://www.devmynd.com/blog/imposter-syndrome-feels-not-reals/">DevMynd Software Blog</a>.</p>
<p><img src="https://minaslater.blog/images/post-3/doctor-pointing-at-computer.jpeg" alt="Doctor pointing at
computer" />
Image source: <a href="https://www.pexels.com">pexels.com</a></p>
<p>Imposter Syndrome (also known as Doubtia Debilitus) is a wide-spread neurological disorder caused by the disconnect between perception and reality of one’s abilities. It commonly affects newborn Software Developers from a non-traditional background, but has been observed amongst individuals of all dev-ages and backgrounds. It is generally triggered by comparing oneself to a false ideal, and conditions can worsen if symptoms are left untreated.</p>
<hr />
<h2 id="symptoms">Symptoms</h2>
<p>Some common symptoms include, but are not limited to:</p>
<p><strong>Tunnel Vision</strong> – Usually imperceptible at an early stage, you might find yourself hyper-focused on minuscule areas of imperfection in largely successful endeavors. Despite overwhelming evidence to the contrary, you see the venture as a failure as a result.</p>
<p><strong>Paranoid Delusions</strong> – The intense focus on small mistakes/areas for improvement can increase in severity and cause you to create inaccurate analysis of your self-worth. The perceived “failure” becomes the defining characteristic of yourself and you become convinced that this unknowledgeable true-self will one day be exposed.</p>
<p><strong>Paralysis</strong> – The virus attacks the brain and body with such severity that it can sometimes cause productivity to come to a halt. This is a response to your extremely high perceived rate of failure, and they have concluded that “if I don’t start, I can’t fail.”</p>
<hr />
<h2 id="treatments">Treatments</h2>
<p>Doctors recommend the following techniques to treat Imposter Syndrome. These are found to be the most effective treatments by the Researcher; your mileage may vary.</p>
<p><strong>Change it up</strong> – Identify and remove yourself from environmental triggers, if only briefly, that could exacerbate symptoms. For instance, if you have consistently been working closely with someone much more experienced, it is suggested that you seek out opportunities to work alone or with someone who is more comparable in experience. While pairing with a senior developer is an excellent learning opportunity, it could sometimes lead to unrealistic expectations and self-assessment of yourself. This could occur no matter how supportive from the team. It is important to remember that though it may feel like you don’t know as much, even experienced developers sometimes Google simple things and you still have skills that are valuable and can contribute to the project.</p>
<p><strong>Celebrate wins</strong> – The virus takes hold in your brain by exponentially multiplying negative thoughts. Fight it by celebrating any and all achievements, no matter how minuscule they might seem: “I took on a feature independently.”, “I demonstrated something for the Client.”, or “I gave my first lightning talk in front of a group.” Acknowledge these wins without qualifying it, then find a friend to give you a high-five or, if alone, give yourself a mental one. Consistency with treatment is a challenge, especially as the virus fights back. Keep at it. Maybe once or twice a day to start, and work up the frequency. Pretty soon, it will become second nature.</p>
<p><strong>External affirmation</strong> – Taking the previous treatment a step further: when you are given a compliment, be sure to allow yourself to accept it. Strike words like “just”, “only”, “well…”, and “lucky” from your vocabulary. No more responding to compliments with: “It was just lightning talk.”, “Well… So-and-so had done it better.” or “I was lucky I got that job offer.”; a simple “Thank you” will do. Take pride in that someone else have noticed your achievement. Downplaying the significance of what you have done will only create fuel for the virus and feed into the negativity that it craves.</p>
<hr />
<h2 id="long-termeffects">Long Term Effects</h2>
<p>Whatever methods of treatment work for you, embrace it. But remember: we are all human. When you lapse and the virus is filling you with negative thoughts, don’t fret. Acknowledge what is happening and remember the achievements that got you to where you are. We are all learning to live with various degrees of imposter syndrome, and clinical trials conducted have uncovered that while the condition is serious, it is not chronic or terminal.</p>
<hr />
<p><em>The research cited was from personal experience, no official clinical trials were conducted. No medical personnel were involved in the writing of this article.</em></p>
</description>
<pubDate>Thu, 13 Sep 2018 00:00:00 -0500</pubDate>
<link>https://minaslater.blog/2018/09/13/imposter-syndrome/</link>
<guid isPermaLink="true">https://minaslater.blog/2018/09/13/imposter-syndrome/</guid>
<category>soft skills</category>
<category>imposter syndrome</category>
<category>CodeNewbie</category>
</item>
<item>
<title>What is ReST - An Interview Survival Guide</title>
<description><p>I was recently caught off-guard at a job interview by this question: </p>
<blockquote>
<p>What is ReST?</p>
</blockquote>
<p>While my bootcamp instructors drilled us with algorithmic problems as found on Codewars, we did not allocate as much attention to the talk-about-coding type interview questions. Thinking back, it was negligent of me to assume that just because I understand something enough to use it, I could talk about it eloquently too.</p>
<p>WRONG!</p>
<p>I think I mumbled something about using HTTP verbs and URLs. I don’t really remember; I may have blacked out.</p>
<p>The paragraphs and images that follow barely skim the surface of understanding ReST, but should be sufficient knowledge to get you through your interview. </p>
<p>This is also what I wish I had given as my answer.</p>
<h3 id="rest-stands-for-representational-statetransfer">ReST stands for Representational State Transfer</h3>
<p>So, now that that’s out of the way, we can get down to what it actually means.</p>
<p>Assuming that you, the Reader, are familiar with the Client-Server-Database structure of most web applications, the short answer is that ReST is a set of guidelines that describes how your client communicates with your server.</p>
<p><img src="https://minaslater.blog/images/post-2/rest_cartoon.jpg" alt="ReSTful cartoon" />
Image by: <a href="http://http://doodlingdev.com/">DoodlingDev</a> </p>
<p>A “ReSTful” design is complex; way more complex than an Interviewer is looking for in a short interview answer. Here, we will cover the following:</p>
<ul>
<li>Endpoints named after resources</li>
<li>Actions performed on those endpoints</li>
<li>Stateless communications</li>
</ul>
<p>SIDEBAR: If you are interested in diving into the nitty-gritty of ReSt, here is Chapter 5 of Roy Fielding’s dissertation.</p>
<h2 id="hockey">HOCKEY!</h2>
<p>Let’s say I have a very simple CRUD web application for a hockey league, where I keep track of all the teams in the league. Upon surveying the Users, I have condensed the user stories down to the following:</p>
<ol>
<li>As a User, I want to be able to create a team, so that I can add a new team when they join the league.</li>
<li>As a User, I want to see (read) all the teams, so that I can get an overview of the league.</li>
<li>As a User, I want to be able to update a team’s information, so that I can track wins and losses.</li>
<li>As a User, I want to be able to delete a team, so that I can remove a team when they leave the league.</li>
</ol>
<p>Knowing that a route consists of two parts: the path / URL and an HTTP action verb, let’s get started.</p>
<h3 id="resources-as-endpoints">Resources as Endpoints</h3>
<p>In a ReSTful architecture, the path is a noun describing a resource that is being accessed. It is generally named after database models (tables). These paths are the endpoints our client requests will hit.</p>
<p>In the hockey app above, our requests should all hit the path representing the Team resource. So let’s start the routes there:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. /team
2. /teams
3. /team
4. /team
</code></pre></div></div>
<h3 id="actions-on-endpoints">Actions on Endpoints</h3>
<blockquote>
<p>If all these User Stories hit the same endpoint, how does the server know which of the actions to perform?</p>
</blockquote>
<p>In order to differentiate between each of the CRUD activities, our request from the client will also send an HTTP action verb to the server, along with the path of the endpoint the app wants to hit. </p>
<p>Let’s update our routes for the hockey app:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. POST /team
2. GET /teams
3. PUT or PATCH /team
4. DELETE /team
</code></pre></div></div>
<h3 id="stateless-communication">Stateless Communication</h3>
<p>Another big part of ReSTful design is that the “communications must be stateless in nature” (Roy Fielding). That simply boils down to the fact that all the information needed to understand each request is sent along as part of the request itself.</p>
<p>For our hockey app, we will need to add something to the PUT/PATCH and DELETE routes so that our server knows which team we want to apply the action to.</p>
<p>Like so, where 1 will be the id of a specific team:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. POST /team
2. GET /teams
3. PUT or PATCH /team/1
4. DELETE /team/1
</code></pre></div></div>
<h2 id="tldr">TL;DR</h2>
<p>To sum up the above points into a concise answer to the question, “What is ReST?”:</p>
<blockquote>
<p>ReST is a structure for the communication between client and server, where each path is a noun, named after the resource being accessed. The requests contain an HTTP verb to define the action to be performed on the endpoint, as well as everything necessary to understand the request.</p>
</blockquote>
<p>There you have it. It is two weeks late for that interview, but here is my answer.</p>
</description>
<pubDate>Sat, 28 Apr 2018 00:00:00 -0500</pubDate>
<link>https://minaslater.blog/2018/04/28/what-is-rest/</link>
<guid isPermaLink="true">https://minaslater.blog/2018/04/28/what-is-rest/</guid>
<category>interview</category>
<category>api</category>
<category>CodeNewbie</category>
</item>
<item>
<title>Why I Started Coding</title>
<description><p>Have you ever gone to a magic show or seen a magic trick and immediately feel the need to know every little secret about how it was performed?</p>
<blockquote>
<p>That is me.</p>
</blockquote>
<p>I discovered this about myself early on, as a small child watching David Copperfield move a helicopter through the Great Wall on television and as a teenager hanging on to every secret the Masked Magician gave away. Later, as my entertainment career took me down the path toward variety and circus, I watched closely as magicians I worked with prepared for their shows. I wanted to know where every rabbit and chick came from, when that red ball went from the cup on the left to the cup on the right, and how on EARTH he knew the word in her head was “mug”.</p>
<p>Maybe unsurprisingly then, I married a variety performer. I. HIT. THE. JACKPOT. I bombarded him with questions after every magic show we saw and asked him to teach me card trick maneuvers that my hands were too small to perform.</p>
<p>It was with this level of curiosity and drive for information I first approached web development. My clown-husband had already veered left on his own career path, went to a coding bootcamp and started working as a web developer. All I knew about it at the start was that he would sit at a computer screen (with a dark background, WEIRD) for hours, typing out these colorful texts and VOILA! websites happen!</p>
<blockquote>
<p>Just like a magic trick.</p>
</blockquote>
<p>After watching this digital wizardry happen under my roof for about a year, I finally asked him to show me what he was doing and how these text files turn into websites and applications. This is where my programming journey began.</p>
<p>I learned the basics of the command line, went through a short tutorial about HTML/CSS, and he introduced me to Ruby. It felt very powerful, the way that I made things happen by doing something seemingly unrelated. I was the magician and my hands were not too small for these tricks.</p>
<p>…and now, for my first trick!
<img src="/images/post-1/first-program.png" alt="my first program!" /></p>
<p>I also always had an aptitude for thinking outside of the box, and was rarely stumped by a riddle or logic puzzle. In school, I was great at math (I essentially taught myself trigonometry), but hated the rigid repetition of math classes. Writing code gave me the creative outlet I craved, but it was objective. There are countless different ways to solve a problem in coding, but every problem still has a very clear correct answer. I can’t talk my way out of code that doesn’t work and to me, that’s liberating. There is no ifs or buts about it: either code works or it doesn’t. You can make code cleaner, DRYer, and more concise, but it always has to work, otherwise it’s wrong.</p>
<p><img src="/images/post-1/hipster-ariel.jpg" alt="hipster Ariel" /></p>
<p>Admittedly, the process has been filled with lots of bumps in the road. I struggled to master the Art of Google. When I started to learn Rails, I had the hardest time understanding how the internet works, and couldn’t wrap my brain around HTTP requests/responses.</p>
<p>Predictably, in hindsight, the biggest pushback I gave was to the concept of “Rails Magic”; I had a really hard time accepting that the Rails source code was just too much for a beginner and that I needed to move on for now, let it help me and get back to uncovering the secrets later. The turning point that saved me from quitting came in the form of a talk at RailsConf 2017. Thanks to Alex Kitchens and his <a href="https://www.youtube.com/watch?v=Q_MpGRfnY5s">Perusing the Rails Source Code - A Beginner’s Guide</a> in which he said that “…there is no magic [in Rails].”</p>
<p><img src="/images/post-1/mind-blown.png" alt="mind. blown." /></p>
<p>Learning to code is the most challenging thing I have ever taken on and, from what I hear, the journey never really ends. There are countless magic tricks still for me to discover and pick apart, and I’m excited for the opportunities to discover all the “secrets” the tech world has to offer.</p>
</description>
<pubDate>Mon, 09 Oct 2017 00:00:00 -0500</pubDate>
<link>https://minaslater.blog/2017/10/09/why-i-started-coding/</link>
<guid isPermaLink="true">https://minaslater.blog/2017/10/09/why-i-started-coding/</guid>
<category>personal</category>
<category>CodeNewbie</category>
</item>
</channel>
</rss>