<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Tech Philosopher]]></title><description><![CDATA[The Tech Philosopher]]></description><link>https://thephilosopher.tech</link><generator>RSS for Node</generator><lastBuildDate>Tue, 12 May 2026 02:53:41 GMT</lastBuildDate><atom:link href="https://thephilosopher.tech/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why Being on HackerNews is a Superpower]]></title><description><![CDATA[When I first logged onto IRC circa 2001, the internet was a curious place, instantly connecting me to other nerd kids. Over the years, it has turned exceedingly bitter, and HackerNews is no exception.
I’ve been an “active lurker” since 2008, occasion...]]></description><link>https://thephilosopher.tech/why-being-on-hackernews-is-a-superpower</link><guid isPermaLink="true">https://thephilosopher.tech/why-being-on-hackernews-is-a-superpower</guid><category><![CDATA[Developer]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Sun, 17 Nov 2024 09:04:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/_Zua2hyvTBk/upload/8e44974a29fe6df9feea8e780131a8dc.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I first logged onto IRC circa 2001, the internet was a curious place, instantly connecting me to other nerd kids. Over the years, it has turned exceedingly bitter, and HackerNews is no exception.</p>
<p>I’ve been an “active lurker” since 2008, occasionally submitting my own writing (had my earliest “first-pager” in 2012). For me, the most important part of HackerNews is the <strong>comments section.</strong></p>
<p>If you open the comments section of almost any first-page link, you’ll usually find trolling, trashing, and other pessimistic behavior that clouds everything good. Over all these years, my instinct tells me that only a small percentage of people post most of the negativity. And I’m not talking about proper constructive criticism, but the usual internet rage that was so common during the early forum flame wars.</p>
<p>That can make one think that the place is not worth visiting. But when I looked closely, I found that although the amount of unhelpful comments had gone up, there were still the same quantity of gems to be found as I did over a decade ago.</p>
<p>While reading comments on an SICP post, I learnt that Sussman published a title in 2021 called <em>“Software Design for Flexibility: How to Avoid Programming Yourself Into a Corner.”</em> I got my copy of SICP while I was still in college, and had also viewed some of his MIT lectures. In an instant, I bought the hardcover to open my mind to more great ideas.</p>
<p><strong>To whoever commented</strong> <strong>the above</strong>, you folks are the real gems of the community, and made me discover things that neither the first page of Google, or the supposed “RAG-based knowledge tools” are able to surface.</p>
<p>And just like that, the people who are willing to participate in the community…</p>
<p>…who are okay ignoring the negativity…</p>
<p>…who are okay disagreeing respectfully…</p>
<p>…will eventually <strong>dig a lot of gold</strong>. Convenient tools will just make others myopic.</p>
<p>Disconnecting from this community might cast a big blind spot in my potential for knowledge, because I’ll be disconnecting from a lot of smart folks whom I might never meet in real life.</p>
<p>Or, maybe I will?</p>
]]></content:encoded></item><item><title><![CDATA[VP of Package.json - Why Does Title Inflation Happen in Tech?]]></title><description><![CDATA[I once saw a VP of <Database Name> at an unrelated startup. That's one example of title inflation. When the title (like "VP") inflates, the area of responsibility (Engineering, Frontend, Backend) usually deflates. But why does this happen?
First, it'...]]></description><link>https://thephilosopher.tech/vp-of-packagejson-why-does-title-inflation-happen-in-tech</link><guid isPermaLink="true">https://thephilosopher.tech/vp-of-packagejson-why-does-title-inflation-happen-in-tech</guid><category><![CDATA[software development]]></category><category><![CDATA[Career]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Thu, 16 May 2024 17:27:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/FHMTJLJfMBg/upload/2ba8e17f28bcd5a5f1556c2eea1df1c9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I once saw a <em>VP of &lt;Database Name&gt;</em> at an unrelated startup. That's one example of title inflation. When the title (like "VP") <em>inflates,</em> the area of responsibility (Engineering, Frontend, Backend) usually <em>deflates.</em> But why does this happen?</p>
<p>First, it's compensation. If one is not paid market salary, the company can still offer him a title that the market won't. It's a legitimate strategy if the person can grow into the title eventually. But more often than not, the title is seen as an "end" rather than the beginning.</p>
<p>Second, the person's history. A CTO of a small startup would probably not want to become a SDE-III at a medium-scale startup. So the medium-scale startup invents a position between an engineer and the CTO.</p>
<p>Third, to make room for internal promotions. Everyone expects their designations and salaries to grow. But an organisation might just have junior &amp; senior engineers, with a CTO at the top. And the only way to promote senior engineers would be to invent new titles yet again, even if the job responsibilities don't change.</p>
<p>All this leads to a designations not being comparable between companies. You have to look closely at the areas of responsibilities rather than the title alone.</p>
]]></content:encoded></item><item><title><![CDATA[Building Invaluable Understanding as a Beginner Engineer]]></title><description><![CDATA[I was reading other blog posts on HashNode, specifically a detailed piece on How Long Does it Take to Become a Software Engineer by Denis Khodishchenko. Amongst a lot of good points, one that resonated with me the most was building foundational knowl...]]></description><link>https://thephilosopher.tech/building-invaluable-understanding-as-a-beginner-engineer</link><guid isPermaLink="true">https://thephilosopher.tech/building-invaluable-understanding-as-a-beginner-engineer</guid><category><![CDATA[programming]]></category><category><![CDATA[software development]]></category><category><![CDATA[software architecture]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Thu, 16 May 2024 06:44:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/npxXWgQ33ZQ/upload/de9a5a9cb124b0b77bf6d8d58ca0d32b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was reading other blog posts on HashNode, specifically a detailed piece on <a target="_blank" href="https://denislearns.tech/how-long-does-it-take-to-become-a-software-engineer"><em>How Long Does it Take to Become a Software Engineer</em></a> by <a class="user-mention" href="https://hashnode.com/@denislearnstech">Denis Khodishchenko</a>. Amongst a lot of good points, one that resonated with me the most was <em>building foundational knowledge.</em> I'm a living proof that it works, and I'll also tell you how to get started.</p>
<p>I started learning to program as a kid. I got my first computer when I was 10ish, and since I liked playing games, one day I wondered, what would it be liked to create one? And that's how my programming journey started at the age of 11.</p>
<p>Initially, I started learning a tool called GameMaker, which was a free product created by Professor Mark Overmars. It was a fabulous piece of software. As I grew up, I learnt that GameMaker was acquired and is now published by <a target="_blank" href="https://yoyogames.com">YoYo Games.</a> It was quite cool to see a hobby software turn into a great commercial product.</p>
<p>But it was not GameMaker itself as a software that inspired me to program, and continue program. No. The secret's something else. Before I get into it, though, I want to tell you that I struggled to learn programming like anyone else. It's like learning to balance a bicycle. When you try 100 things trying to find the one thing that works, you're gonna fail 99 times. And those kinds of failures are not really failures because you're still moving forward. However, if you give up, you've stopped, and that's real failure. And the most heart-breaking thing is thinking that something is impossible, even though you had more than enough in you to attain it.</p>
<p>One peculiar thing about the internet back then was that it was not as crowded. There were other kids out there my age who were also into programming. And since the internet was not cluttered, you didn't find a lot of "programming is insanely difficult," or "you really can't program" kind of negativity to kill your spirits. People talked about ideas and how to implement them. And the secret to me learning to program well was the GameMaker community/forum.</p>
<p>Unlike StackOverflow today, it was not a pointed question / pointed answer kind of a thing. Discussions were welcome, even about controversial choices. There was a section for people to showcase what hey had built, which inspired me further. But why does all that matter?</p>
<p>Because you get feedback, you feel useful. And that was important to me as a kid. Because even if I accomplished something small, and couldn't myself gauge how valuable it was, there were still a bunch of people who found my silly program useful. Who learnt from it. Or used it. Or liked my advice on how to improve something.</p>
<p>In that era, you'd talk to people through your work. Rather than just talking "at your work" as it happens today. Some feedbacks were good and inspiring, some were blunt or heart-crushing, but at least they were all honest.</p>
<p>We didn't have "titles." We were not even from the same continent. We were not all fluent in the same language. But we spoke the language of code and creation. Everyone created something, and everyone else responded to that creation. And that's all that mattered. That was our litmus test for knowledge: could we build it?</p>
<p>While today the focus is a lot on proxies for ability, like the number of social media followers, job title, years of experience, etc. But then, it was just pure build. Like Bobby Fischer said, "Play the board, not the man." We played the board. In today's media-happy world, we often don't.</p>
<p>In the subsequent years that technology has changed, I've found something profound. I can look at a piece of code, or a piece of software, or even a behemoth like AWS, and look at a screen for the very first time and still "solve" problems that a normal person couldn't. Why? Not because I was experienced with the AWS console. But I understood the principles by which that product had to work, even if I didn't know how the product was designed. It was like having a great superpower. And that power came from foundational thinking. First principles.</p>
<p>When you learn something vaguely you learn how it works. When you truly understand something you learn <em>how it must work.</em> And once you have the principles, you don't have to endlessly chase goals. Or new frameworks. Or new paradigms. They're all tradeoffs between different principles after all.</p>
<p>So what are those principles? In software engineering, it's only one. It's the ability to "put any puzzle together." In the case of writing code, the puzzle pieces are syntax, and the puzzle is creating a program.</p>
<p>In the case of systems design, the puzzle pieces are individual components that you use, and the puzzle is a system that behaves in a manner you want, while to the largest possible effect avoiding side-effects that you don't desire.</p>
<p>But syntax, components, algorithms, all of that change. Imagine what the world's first computer scientist must have known to become a computer scientist. They didn't have a syllabus. Nor a textbook. Nor ages of knowledge to assimilate before calling oneself a computer scientist. And that's the key. That something, that skill, that makes a person discover things. Even today, that's true of a computer scientist or a software engineer. A person who pushed the needle of knowledge forward, regardless of how much of it is already discovered. If a large stack is already discovered, that clouds what we are supposed to do. But we are supposed to move forward nonetheless.</p>
]]></content:encoded></item><item><title><![CDATA[Iterative is Not Incremental]]></title><description><![CDATA[Correlation is not causation, is something that you'll hear often in statistics. Similarly, I think Agile deserves one, Iterative is not Incremental.
Before we get into the waterfall vs. agile flame war, let's define what we mean by waterfall. Loosel...]]></description><link>https://thephilosopher.tech/iterative-is-not-incremental</link><guid isPermaLink="true">https://thephilosopher.tech/iterative-is-not-incremental</guid><category><![CDATA[agile]]></category><category><![CDATA[software development]]></category><category><![CDATA[iterative]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Wed, 20 Mar 2024 03:11:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/-gjHizUfFlM/upload/259cf5b1696bf2205fa1eb121ebbba01.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Correlation is not causation</em>, is something that you'll hear often in statistics. Similarly, I think Agile deserves one, <em>Iterative is not Incremental</em>.</p>
<p>Before we get into the waterfall vs. agile flame war, let's define what we mean by waterfall. Loosely, it is said that waterfall is akin to <em>long-term planning</em> while agile is <em>responding to changes as they happen</em>. But that's an overly simplistic definition of each.</p>
<p>Any endeavour will have a long-term vision and a set of short-term projects to support that vision. If you want to be a better engineer five years from today, you have different options; be it mastering algorithms, or learning TLA+ to improve your chops for distributed systems, or designing the next Rust.</p>
<p>Thus, long-term and short-term thinking in themselves are not the differentiating characteristics between waterfall and agile.</p>
<p>Planning happens at many levels. Just like a current flows through resistance, "heading" for a destination in the face of random obstructions, so does the execution of our plans. For example, the exact actions that'd contribute to your 5-year goal of becoming a better engineer could keep changing. It could be learning Rust today, prompt engineering tomorrow, and systems engineering the day after. Although your goal is still the same, your immediate actions depend on the immediate circumstances.</p>
<p>Navigating a goal is much like navigating traffic. You may go straight, take detours, or even go <em>against the direction of a goal</em> temporarily because the "road" was closed. But your destination is still the same. It's as if the goal was an abstract class and your immediate actions the most viable implementations.</p>
<p>So it's not long-term vs. short-term when we talk about waterfall and agile. It is the rigidity of the details. Earlier waterfall models insisted on having all the details, even the tiniest one, up-front. Which is akin to you deciding which specific courses you'll do for the next 5 years. But maybe by year 2, there is a better course for learning Rust, or the one you had in mind got outdated.</p>
<p>Or maybe your goal isn't "learning Rust." It's learning something cutting-edge. It happens to be Rust (and many other things) today. Tomorrow, when you actually sit down to do something new, it very well could be something else.</p>
<p>Thus, agile's response to changes has to do with the details, not the goal itself. Waterfall would be like a predefined plan, whereas Agile would be a policy that's applied to a changing landscape like a reinforcement-learning agent.</p>
<p>However, there is a way to take even agile too far. One can much as easily assume that having any kind of long-term goal is NOT agile because it locks you in. And we should be willing to change long-term goals too. True, that can sometimes happen. But you wouldn't want to work at a startup that was creating a database in the morning, a game in the afternoon, and finally pivoted to being a todo-list app in the evening.</p>
<p>Agile doesn't mean you shouldn't have long-term goals. But what it means is in the face of a policy biased toward some long-term goal, you should act intelligently on the actual circumstances rather than what you wished the circumstances were.</p>
<p>Waterfall tries to build a plan that can be greedily followed. Agile keeps the option open for maximising long-term outcomes, even if you make u-turns in the short term. And that's where the distinguishing characteristics of <em>Iterative not being Incremental comes in</em>.</p>
<p>Incremental is a greedy strategy. You had 5 lines of code yesterday, today you'll have 3 more, and tomorrow you'll have 4 more. They all add up to 14 lines of code.</p>
<p>Iterative looks a bit different. You have 5 lines of code today, which exposed some problems with the original design. Tomorrow, you have a different 4 lines of code as you threw out the 5 you had written previously. And so on. In the end, you end up with 3 lines of code that solved your problem, but only after you threw away 34 that didn't.</p>
<p>If we don't throw things away, then we'd be resistant to doing experiments to learn new things. And the iterative strategy often has us take detours, u-turns, for the long-term good, whereas incremental insists on short-term gains. If you have a feeling you're not making a lot of progress, you may benefit from viewing it from an iterative lens rather than an incremental lens.</p>
]]></content:encoded></item><item><title><![CDATA[The "Hidden Standards" Problem in Interviews]]></title><description><![CDATA[The inflection point of every tech interview is when the interviewer gives a scenario, the candidate seemingly answers correctly, yet the interviewer rejects the candidate on the absurdity of the solution. Why do correct solutions tend to look absurd...]]></description><link>https://thephilosopher.tech/the-hidden-standards-problem-in-interviews</link><guid isPermaLink="true">https://thephilosopher.tech/the-hidden-standards-problem-in-interviews</guid><category><![CDATA[interview]]></category><category><![CDATA[CodingInterview]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Tue, 19 Mar 2024 01:33:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/HK8IoD-5zpg/upload/c2b11894c2e2d9da02aa0e1a5c431972.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The inflection point of every tech interview is when the interviewer gives a scenario, the candidate seemingly answers correctly, yet the interviewer rejects the candidate on the absurdity of the solution. Why do correct solutions tend to look absurd? Because of how questions are constructed in the first place.</p>
<p>Startup engineers are NOT usually taught how to interview. If someone is good at their job, it is assumed that he can evaluate potential candidates. You'll thus find people with limited technical experience, and still lacking the maturity of working with a diverse team, having the authority to determine who works for the company.</p>
<p>When people are not taught, they wing it. A primary mistake in interviewing is conflating concepts with knowledge. Unless someone is really good at software engineering, he has not yet learnt that syntax is NOT semantics, and the Kafka queue he learnt in a systems design Udemy course is not the only way to build this particular system.</p>
<p>The conflating of concepts with knowledge degrades the whole interview process to "<em>how many different solutions have you memorised</em>" instead of "<em>do you have the ability to understand new problems and the skills to deal with them?</em>" And the reason this is culturally acceptable is because this is how schools work.</p>
<p>Thus, it becomes important for your interviewer to hear things like "Kafka" or "Microservices" rather than answer the candidate's <em>petty questions</em> like "<em>why do you need BigData for 100GB of data that you have?</em>"</p>
<p>Because the emphasis is on arbitrary solutions rather than problems, there is never a good exchange of problems in an interview. Only comparing notes on "who has implemented a bigger solution so far in life."</p>
<p>For you to understand what a candidate has accomplished, it's important to understand the landscape of the problems that he dealt with. Sure, he wrote an app to work with Sqlite databases, which sounds very simplistic. However, when you look closer, you realise that he got the company migrated off-of ScyllaDB by rearchitecting a read-heavy application to use Sqlite over S3. And the primary motive was saving cost. Yeah, the solution does not look "cool," but he managed to pull off a major cost optimisation project. Usually, the arrogance of the interviewer prevents him from understanding the problem statement of the candidate, because it's not the interviewer who is getting interviewed.</p>
<p>On the flip side, inexperienced interviewers also see the world in black and white and think that their problem statements are the ONLY kind of problem statements that exist. They'll go ahead and ask, "<em>How would you ensure that you rate-limit APIs properly?</em>" The candidate, not knowing the details of the problem, and being rebuffed on asking more details, answers: "<em>Well, I would just make sure the WAF takes care of any abnormal traffic; I wouldn't add anything more to it unless deemed necessary.</em>"</p>
<p>The above is not a bad answer in itself. It answers on the side of security (availability). But the interviewer's company rate-limits APIs because there is a non-public enterprise-tier API that is billed per call. But he never mentions this landscape to the candidate.</p>
<p>Now, many might jump to say, it's the candidate's job to fish out information. Well, most of the developing engineers don't have the skills to ferret out information either. Or else, there won't be such a big disconnect between the development and the product management team. The disconnect with the business teams is greater still on both sides. It's just that the interviewer has assumed what they know is what "<em>programming is all about</em>," and anyone who doesn't know it is "<em>not a programmer.</em>"</p>
<p>That's the <em>hidden standard</em> right there. Whatever answers you give as a candidate, the interviewer adds additional "data points" to it, and then deems the final picture incoherent. But these hidden standards are not known to the candidate, even if he had the ability to solve the company's problem.</p>
<p>Additionally, the problems communicated to the candidate are usually described through the lens of the interviewer. Most of the times, I've seen good engineers solve problems because they <em>viewed the problem differently</em>, not because they <em>computed differently on the exact same definition of the problem.</em> So one must not set up the problem landscape and be so biased toward it that opposing views are dismissed even before being evaluated on their merits.</p>
<p>It is hyper-critical that we expect candidates to instantly jump to an answer with incomplete and biased information, whereas we ourselves would have taken days to internalise the requirements, weeks to fight over the timelines, and months making excuses about a buggy implementation.</p>
<p>Any time we're not able to evaluate skills, we degrade to evaluating memory in the name of experience.</p>
]]></content:encoded></item><item><title><![CDATA[Big Data, Big Junk]]></title><description><![CDATA["You must not waste food," I was told a lot as a picky eater. And it was not just about food wastage. We got lessons each time we forgot to switch off the fan, or accidentally kept the TV on, or scribbled something unimportant in our precious noteboo...]]></description><link>https://thephilosopher.tech/big-data-big-junk</link><guid isPermaLink="true">https://thephilosopher.tech/big-data-big-junk</guid><category><![CDATA[Philosophy]]></category><category><![CDATA[minimalism]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Mon, 18 Mar 2024 16:48:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/CIbgRsgwunE/upload/3a927f3f78a002a4aea732cabaa8cf61.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"You must not waste food," I was told a lot as a picky eater. And it was not just about food wastage. We got lessons each time we forgot to switch off the fan, or accidentally kept the TV on, or scribbled something unimportant in our precious notebooks. But because of our misunderstanding of what constitutes waste, we've forgotten the art of throwing things away.</p>
<p>The word <em>waste</em> has two meanings.</p>
<blockquote>
<p><strong>(1) waste:</strong> The act of expending something carelessly, extravagantly, or to no purpose.</p>
<p><strong>(2) waste:</strong> Unwanted or unusable material, substances, or by-products.</p>
</blockquote>
<p>When we hear the word <em>waste</em>, usually the first definition above comes to mind. And we immediately go into "avoiding waste mode," sometimes to the detriment of hoarding stuff we don't really need. And the society drills this "anti-waste" lesson very covertly. For example, a parent can accuse a child of wasting food, without drawing attention to the fact that the parent also contributed to the wastage by knowingly giving the child food that she hated.</p>
<p>However, the rest of the article is going to be about the second definition above. The <em>unwanted</em> or <em>unusable</em> things that we should definitely get rid of.</p>
<p>I'm not a productivity buff, but I am happier when I'm doing a lot of things. Doesn't matter if it's reading books, writing an intricate piece of software, or figure out the source code of DuckDB. Today, as I was re-reading David Allen's <em>Getting Things Done</em>®, I saw a phrase:</p>
<blockquote>
<p><em>"Some executives I have coached have found it extremely useful to arrange for a large trash bin to be parked immediately outside their offices the day we work together!"</em></p>
</blockquote>
<p>The bigger context above is that as you organise and write ideas on pieces of paper, there's a lot that you'll throw away because they didn't pan out. As I read that line, however, it occurred to me that an under-appreciated art is that of <em>throwing unwanted things away.</em></p>
<p>For example, as a programmer, I know that many novices initially learn to "not waste code." They don't want to write something that they will have to rewrite. They focus heavily on getting the specs right, not chasing a moving goal post, and the likes. We all like "agile," but only as long as the development is incremental rather than iterative (they both are not the same thing).</p>
<p>Experienced programmers, however, do plenty of proofs-of-concepts with throwaway code to clarify a problem and experiment with new ideas. Once you obtain new understanding, you usually don't need original notes or apparatus in order to "keep that understanding." They might come in handy when you're communicating with someone else, but we're not going there.</p>
<p>Only in school do you need to show your work. In the real-world, you just need to show that it works, and how you got there usually is far more amorphous than a typical school-grade math problem.</p>
<p>In short, we tend to not throw away things that we should, assuming that it is the "unethical kind of wastage."</p>
<p>Technology appears to solve the waste management problem, but all it does is make it easier for us to hoard. We no longer have to make that judgement between important vs. unimportant, or necessary vs. unnecessary. We just keep them all.</p>
<p>For example, in the early days, emails had limited space. You had to delete stuff if you wanted to clear up space for new emails. The same was with SMSes and contact lists on our cell phones. In many cases, if you were into sales for example, the inbuilt capacity was not enough. And you found such people with organisers to keep track of people they've met, their history, etc.</p>
<p>However, ever since Gmail started offering a 1GB storage (and at the time, "ever increasing"), the necessity to go back and delete emails went down drastically. There is a difference between keeping something important for long-term, and avoiding "clearing up the waste basket because the basket is so big."</p>
<p>In this data-hungry world, we hoard things as much as possible, because "who knows when something might come in handy?" What goes for a toss is our judgement of what's useful and what's not.</p>
<p>We're so artful about finding shiny new things, that we forgot the art of throwing away the unwanted. And without the crucial skill to judge the importance of something, we won't recognise gold even if we see it, and we'd think a piece of copper is a 105 carat diamond. Quantity cannot solve quality.</p>
<p>To be more relaxed, throw unwanted things away. Maybe it's your unwanted inventory that's been keeping you from achieving what you truly want.</p>
]]></content:encoded></item><item><title><![CDATA[What Makes for a Good Beginner's Project?]]></title><description><![CDATA[You're able to create fun small scripts as described in some course. But when you want to create something "real-world," you don't know where to start. Between programs that are laughably simplistic and the ones that are gigantic monoliths, how can y...]]></description><link>https://thephilosopher.tech/what-makes-for-a-good-beginners-project</link><guid isPermaLink="true">https://thephilosopher.tech/what-makes-for-a-good-beginners-project</guid><category><![CDATA[learn coding]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Sun, 17 Mar 2024 07:32:35 GMT</pubDate><content:encoded><![CDATA[<p>You're able to create fun small scripts as described in some course. But when you want to create something "real-world," you don't know where to start. Between programs that are laughably simplistic and the ones that are gigantic monoliths, how can you easily write software that's "real-world" enough?</p>
<p>First, let's look at how the complexity of any program is defined, and how it relates to your skill. In truth, it is not true that larger programs are necessarily more complex than smaller ones. Let me explain.</p>
<p>You might agree that a 1000-line program is more complex compared to a 10-line piece of code. But it is possible for a 1000-line program to be just:</p>
<pre><code class="lang-python">print(<span class="hljs-string">"Hello 1"</span>)
print(<span class="hljs-string">"Hello 2"</span>)
...
print(<span class="hljs-string">"Hello 10,000"</span>)
</code></pre>
<p>The program above is not "complex." It's just one line repeated 1000 times.</p>
<p>However, it is possible for just a few lines of code to be extremely confusing. Look at the piece of pseudo-code below:</p>
<pre><code class="lang-python"><span class="hljs-comment"># Pseudo-code credit: Wikipedia</span>
procedure F(A : list of items)
    n := length(A)
    repeat
        swapped := false
        <span class="hljs-keyword">for</span> i := <span class="hljs-number">1</span> to n - <span class="hljs-number">1</span> inclusive do
            <span class="hljs-keyword">if</span> A[i - <span class="hljs-number">1</span>] &gt; A[i] then
                swap(A[i - <span class="hljs-number">1</span>], A[i])
                swapped := true
            end <span class="hljs-keyword">if</span>
        end <span class="hljs-keyword">for</span>
        n := n - <span class="hljs-number">1</span>
    until <span class="hljs-keyword">not</span> swapped
end procedure
</code></pre>
<p>The code above might look complex to you. It is the pseudo-code for an algorithm called <a target="_blank" href="https://en.wikipedia.org/wiki/Bubble_sort">BubbleSort</a>. The code aside, it also takes effort to understand the algorithm itself, its efficiency and correctness.</p>
<p>Thus, it is possible for a small amount of code to look complex, and a large amount of code to still be simple. So where does the complexity come from if not lines of code?</p>
<blockquote>
<p>Complexity is the quantity of interrelationships between lines of code within a piece of software.</p>
</blockquote>
<p>In the first example of endless print statements, we had a great quantity of lines, but each line was fairly independent. You could directly understand line 477 without having to have read the 476 lines that preceded it.</p>
<p>In the second example, however, you might find yourself reading those 13 lines of code repeatedly to understand the role of <em>each line</em> in the grand scheme of things. That's because each line has some relationship to every other line that may not be obvious in the first pass.</p>
<p>Imagine having a 1000-line code where every line was related to every other line, and you had to re-read those 1000 lines repeatedly to understand what each line actually does. Sounds scary? It is. Which is why one major aspect of software engineering is managing complexity, by using abstractions like functions, classes, modules or even APIs. For example, when you read code that's inside one function, you can understand it without needing to know what's inside other functions.</p>
<p>As a programmer, your job is to deal with complexities of software. Thus, if you're creating software that is NOT exercising your ability to deal with complexities, then you'll not grow.</p>
<p>Here are some examples that might be fun to make, but don't really push your boundaries a lot:</p>
<ol>
<li><p>Very simple scripts: These scripts serve as examples of language features. Their purpose is to teach rather than to do something meaningful.</p>
</li>
<li><p>Scripts heavily using external libraries: A small script doing something cool because you off-loaded something to Pandas or Numpy won't push your boundaries. The complexity is being handled by Pandas or Numpy, not you.</p>
</li>
<li><p>Copy-pasting existing code "while understanding it:" The process of thinking about how to write code is far more important than the code itself. When you copy code written by others, although you might understand the code, you've deprived yourself of the opportunity to design it.</p>
</li>
</ol>
<p>Instead, try the following:</p>
<ol>
<li><p>Implementation of an algorithm, whichever it is, because the complexity factors here are quite high. It doesn't matter what the algorithm is. It's just like a jigsaw puzzle; the end actual picture can be anything, but the puzzle is defined by the shapes of the pieces themselves.</p>
</li>
<li><p>Creating something basic from scratch rather than using libraries like Pandas or Numpy. Your code might be inefficient, but you still would learn a lot from implementing the "logic." And that's the most important.</p>
</li>
<li><p>Changing an existing program to do something else or something more. Changing programs means you don't have the flexibility of starting from scratch. You're already constrained by prior decisions. This is where you will understand how abstractions like functions, classes, modules actually work to reduce complexity.</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Learning to Code but Not Able to Build Your Own Ideas?]]></title><description><![CDATA[When a newcomer learns to code from a book, he understands what’s written, and completes all the exercises. Yet, when he sits down to build an idea, the blank screen gives him a “programmer’s block.” He’s clueless where to begin his app that “filters...]]></description><link>https://thephilosopher.tech/learning-to-code-but-not-able-to-build-your-own-ideas</link><guid isPermaLink="true">https://thephilosopher.tech/learning-to-code-but-not-able-to-build-your-own-ideas</guid><category><![CDATA[#codenewbies]]></category><category><![CDATA[learn coding]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Sun, 17 Mar 2024 05:46:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yVxUC9I9Cik/upload/569c288a1d47909a8db0f4685c5ceecf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a newcomer learns to code from a book, he understands what’s written, and completes all the exercises. Yet, when he sits down to build an idea, the blank screen gives him a “programmer’s block.” He’s clueless where to begin his app that “filters out interesting content from Hacker News.” Usually at this point, off he goes to find a “better” course or book.</p>
<p>You may be reading a book, or deep diving into a course. Or maybe you’re perplexed at the overwhelming number of choices. Amongst the innumerable ways one can spin in circles trying to learn to code, what’s the optimal path to building your dream apps?</p>
<p>When I started to program, YouTube didn’t exist, and not a lot of people wrote technical content. We relied on hardcopy books and official programming language documentations. Also, the process was about learning principles so that you could use the documentation as a reference rather than a “tutorial” while you built your idea.</p>
<p>My first year in programming was an uphill battle. As a 11-year-old, I was excited about building something, but also overwhelmed with the complexities of making even a small program work. More than programming languages, even using computers in general was a technical challenge. But when I did come out the other side, I had a good foundational knowledge that was resilient to changes in programming languages, frameworks, technologies, and the likes. I was future-proof. What exactly did I do?</p>
<p>Because of a lack of content, I spent 80% of my time trying to write code, and just 20% of my time reading books or articles. For example, there’s only so much to learn about Lego® before you get your hands dirty trying to build something. The more you build, the more you understand each brick better. Same is with programming.</p>
<p>When I started, I too looked at a blank screen. But I knew what the problem was. My problem was not that I didn’t know C++. My problem was, “now that I know C++, how do I use it to build something?” And the only way to learn is by practicing it. So, how should you practice your Python chops?</p>
<p>Python has great a documentation. There is also a small tutorial about Python embedded in that documentation, called “The Python Tutorial.” It’s free, concise, and useful. Your first step must be perusing this document. This forms your 20%.</p>
<p>The second step is to “build something” from it. Here are some example projects that you can build by just using the Python documentation:</p>
<ol>
<li><p>A program that asks you for your first name, and then last name, and then prints out “Hello, &lt;first name&gt; &lt;last name&gt;.”</p>
</li>
<li><p>A program that asks you for a principal amount, rate of interest, and no. of years, and prints the compound interest at the end of all the years.</p>
</li>
<li><p>A program that reads a menu (item + price) from a file and sorts them by ascending order of price (cheapest first).</p>
</li>
</ol>
<p>The way to approach building something is to:</p>
<ol>
<li><p>Read the Python Tutorial in its entirety first (you can skip the OOP and other advanced chapters).</p>
</li>
<li><p>Then, you pick a project up to build, and mentally sketch out what operations you might have to do in plain-English.</p>
</li>
<li><p>Go back to the Python Tutorial to hunt for specific information that you need.</p>
</li>
</ol>
<p>When you follow the above process, you’ll realize that the “code” is not as important as your thinking process to “write the code” in the first place.</p>
<p>And it is going to be tough. At times you will stare at a blank screen for hours. But remember, your job is NOT to just to “figure out.” You need to learn to “figure out HOW to figure out.” That’s why the software building process appears so painful at the beginning. But soon enough you will reap exponential rewards if you persist.</p>
<p>Regardless of the learning resources that you use, spend 20% of your time reading books and watching courses, and 80% of your time experimenting. And when in doubt, just start with “The Python Tutorial.” Don’t shy away from a blank screen and keep persisting.</p>
]]></content:encoded></item><item><title><![CDATA[The Philosophy of Technology]]></title><description><![CDATA[New frameworks, libraries, and technologies keep getting released like a firehose of innovation. However, there's one thing that often gets neglected. It's not something that you can hold, or contain within a file, or air-gap from the rest of the wor...]]></description><link>https://thephilosopher.tech/the-philosophy-of-technology</link><guid isPermaLink="true">https://thephilosopher.tech/the-philosophy-of-technology</guid><category><![CDATA[Philosophy of computer science]]></category><category><![CDATA[technology]]></category><dc:creator><![CDATA[Raahul Seshadri]]></dc:creator><pubDate>Sat, 17 Feb 2024 04:34:09 GMT</pubDate><content:encoded><![CDATA[<p>New frameworks, libraries, and technologies keep getting released like a firehose of innovation. However, there's one thing that often gets neglected. It's not something that you can hold, or contain within a file, or air-gap from the rest of the world. It's something that can transcend time, yet can get lost with time. That one thing is an <strong>idea.</strong></p>
<p>Welcome to <em>The Tech Philosopher</em>, where we discuss ideas to improve the world through technology. It's not about just the implementation, but the first principles, the creative thought, and the tradeoffs that precedes the execution phase.</p>
<p>And that's what I call the philosophy of technology.</p>
]]></content:encoded></item></channel></rss>