<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: I Want To Learn Programming</title>
    <description>The latest articles on DEV Community by I Want To Learn Programming (@iwtlp).</description>
    <link>https://dev.to/iwtlp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3972025%2Fe11e8f07-aeec-426a-ad31-d74f641ffa18.jpeg</url>
      <title>DEV Community: I Want To Learn Programming</title>
      <link>https://dev.to/iwtlp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iwtlp"/>
    <language>en</language>
    <item>
      <title>Why project-based learning beats watching tutorials</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Tue, 09 Jun 2026 03:04:43 +0000</pubDate>
      <link>https://dev.to/iwtlp/why-project-based-learning-beats-watching-tutorials-3eoh</link>
      <guid>https://dev.to/iwtlp/why-project-based-learning-beats-watching-tutorials-3eoh</guid>
      <description>&lt;p&gt;Almost everyone learning to code hits the same wall: you have watched dozens of hours of tutorials, you nod along to every line, and then you open a blank file and freeze. This is "tutorial hell," and it is not a discipline problem. It is a method problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why watching feels like learning but is not
&lt;/h2&gt;

&lt;p&gt;Watching a tutorial gives you the feeling of understanding because you are following someone else's decisions in real time. But following is not the same as generating. The hard part of programming is not understanding a line once it is written; it is deciding what to write on a blank page, and recovering when it breaks. Tutorials skip exactly that part, because the instructor already made every decision for you.&lt;/p&gt;

&lt;p&gt;It is the difference between watching someone lift weights and lifting them yourself. Only one builds the muscle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building forces you to do
&lt;/h2&gt;

&lt;p&gt;When you build something yourself, you are forced through the skills that actually matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deciding what to write&lt;/strong&gt; from a vague goal, which is most of real programming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hitting errors and reading them&lt;/strong&gt;, forming a hypothesis, and finding the cause. Debugging is the core skill, and you only practice it when your own code fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holding the whole problem in your head&lt;/strong&gt;, not just the current line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recalling instead of recognizing.&lt;/strong&gt; Recognizing a concept in a video is easy; recalling it from a blank page is the skill you are actually after.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why people who build a handful of real projects outpace people who finish ten courses.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to escape tutorial hell
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build the thing, then look up only what you are stuck on.&lt;/strong&gt; Reverse the order: start with the blank page, not the video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it fail.&lt;/strong&gt; Break your working code on purpose and fix it. Bugs are where learning concentrates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get immediate feedback.&lt;/strong&gt; The longer the gap between writing code and finding out whether it works, the less you learn. Fast feedback is what keeps you in the loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the projects real and small.&lt;/strong&gt; Not a "calculator app" you copy, but a problem you actually have to think through.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  This is the whole idea behind IWTLP
&lt;/h2&gt;

&lt;p&gt;Every level here is a real problem you solve by writing working code, graded the instant you run it, so you are always building and always getting feedback, never just watching. Passing a project's assessment earns a verifiable certificate, so the proof is in what you built.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iwtlp.com/tracks" rel="noopener noreferrer"&gt;Browse the tracks&lt;/a&gt; and write your first real program. The first project of every discipline is free, no card needed. Close the tutorials and open a blank file. That is where it starts.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>projects</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Pandas vs SQL, when to use each</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Tue, 09 Jun 2026 03:04:41 +0000</pubDate>
      <link>https://dev.to/iwtlp/pandas-vs-sql-when-to-use-each-19jc</link>
      <guid>https://dev.to/iwtlp/pandas-vs-sql-when-to-use-each-19jc</guid>
      <description>&lt;p&gt;Pandas and SQL do a lot of the same things: filter rows, group, aggregate, join. So analysts reasonably ask which to learn and when to use which. The honest answer is that you want both, but they win in different situations. Here is the practical breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  They are more alike than they look
&lt;/h2&gt;

&lt;p&gt;Most core operations map almost one to one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_amount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pandas
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;region&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you know one, the other is mostly a translation exercise. The interesting question is which fits the task.&lt;/p&gt;

&lt;h2&gt;
  
  
  When SQL wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The data lives in a database.&lt;/strong&gt; If it is already in Postgres or a warehouse, query it there. Pulling millions of rows into Python just to filter them is wasteful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale.&lt;/strong&gt; Databases are built to scan, index, and join large tables efficiently. Pandas holds everything in memory, so it hits a wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared, repeatable logic.&lt;/strong&gt; A SQL view or query is easy to share and run on a schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joins across many tables.&lt;/strong&gt; This is SQL's home turf.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When pandas wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exploration and iteration.&lt;/strong&gt; Reshaping, plotting, and trying ideas quickly is smoother in a notebook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything beyond querying.&lt;/strong&gt; Cleaning messy data, feature engineering, applying a custom function row-wise, or feeding a machine learning model. SQL is not built for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixed-format data.&lt;/strong&gt; JSON, CSVs, APIs, and odd files are easier to wrangle in Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualization.&lt;/strong&gt; Pandas plugs straight into Matplotlib and friends.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The pattern most analysts settle on
&lt;/h2&gt;

&lt;p&gt;Use SQL to do the heavy lifting close to the data (filter, join, aggregate, and reduce a huge table to the slice you care about), then pull that smaller result into pandas for cleaning, analysis, modeling, and charts. SQL narrows; pandas explores.&lt;/p&gt;

&lt;p&gt;Learning both is not redundant; it is the standard analyst toolkit. The database answers "what does the data say at scale," and pandas answers "what do I do with this slice."&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn them by doing
&lt;/h2&gt;

&lt;p&gt;The fastest way to feel where each one fits is to run the same analysis both ways. The &lt;a href="https://iwtlp.com/track/data-analysis-sql" rel="noopener noreferrer"&gt;SQL track&lt;/a&gt; builds query skills on real tables, and the &lt;a href="https://iwtlp.com/track/data-science-python" rel="noopener noreferrer"&gt;data science track&lt;/a&gt; builds the pandas-and-beyond side, both graded in your browser. The first project of each is free.&lt;/p&gt;

</description>
      <category>pandas</category>
      <category>sql</category>
      <category>dataanalysis</category>
    </item>
    <item>
      <title>Encoding vs encryption vs hashing, explained simply</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Mon, 08 Jun 2026 18:57:52 +0000</pubDate>
      <link>https://dev.to/iwtlp/encoding-vs-encryption-vs-hashing-explained-simply-1ga5</link>
      <guid>https://dev.to/iwtlp/encoding-vs-encryption-vs-hashing-explained-simply-1ga5</guid>
      <description>&lt;p&gt;Encoding, encryption, and hashing get confused constantly, and the confusion causes real security bugs (like "encrypting" passwords, or trusting Base64 to hide a secret). They solve three different problems. Here is the clear version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoding: for format, not secrecy
&lt;/h2&gt;

&lt;p&gt;Encoding transforms data into another format so it can be stored or transmitted safely, for example Base64 to put binary into text. It is fully reversible by anyone, with no key. Base64 is not security; it is the digital equivalent of writing in a different alphabet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# b'aGVsbG8='  -&amp;gt; anyone can decode this
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; moving data through channels that expect text (data URLs, JSON, email). &lt;strong&gt;Never&lt;/strong&gt; use it to protect anything secret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encryption: for secrecy
&lt;/h2&gt;

&lt;p&gt;Encryption scrambles data with a key so that only someone with the right key can read it. It is reversible, but only if you have the key. This is what protects messages, files, and traffic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plaintext + key -&amp;gt; ciphertext   (and back, with the key)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are two families: symmetric (same key to encrypt and decrypt, fast, for data at rest) and asymmetric (a public key encrypts, a private key decrypts, the basis of HTTPS). The golden rule: do not invent your own; use a vetted library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; anything that must stay secret but be recovered later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hashing: for integrity, one way
&lt;/h2&gt;

&lt;p&gt;A hash function turns any input into a fixed-size fingerprint, and it is deliberately &lt;strong&gt;not&lt;/strong&gt; reversible. The same input always gives the same hash; a tiny change gives a totally different one. You cannot get the original back from the hash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# a fixed 64-char fingerprint
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use it for:&lt;/strong&gt; verifying a file has not changed, storing passwords (with a slow, salted hash like bcrypt or argon2, never plain SHA-256), and de-duplication.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"We encrypt passwords."&lt;/strong&gt; No. Passwords should be &lt;strong&gt;hashed&lt;/strong&gt; (slow + salted), never encrypted, because you never need to recover the original, only check a match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Base64 hides it."&lt;/strong&gt; Encoding is not encryption. Base64 protects nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain SHA-256 for passwords.&lt;/strong&gt; Too fast, so it is brute-forceable. Use a purpose-built password hash.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple way to remember: encoding is for &lt;strong&gt;format&lt;/strong&gt;, encryption is for &lt;strong&gt;secrecy&lt;/strong&gt;, hashing is for &lt;strong&gt;integrity&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  See it by building it
&lt;/h2&gt;

&lt;p&gt;These ideas stick when you implement them: encode and decode Base64 by hand, build a hash-based tamper check, and store a password the right way. The &lt;a href="https://iwtlp.com/track/cybersecurity-python" rel="noopener noreferrer"&gt;cybersecurity track&lt;/a&gt; walks through encoding, hashing, classical and modern crypto, and password cracking, all built and run in your browser. The first project is free.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>fundamentals</category>
    </item>
    <item>
      <title>Why you should build your data structures from scratch once</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Mon, 08 Jun 2026 18:54:58 +0000</pubDate>
      <link>https://dev.to/iwtlp/why-you-should-build-your-data-structures-from-scratch-once-2g3b</link>
      <guid>https://dev.to/iwtlp/why-you-should-build-your-data-structures-from-scratch-once-2g3b</guid>
      <description>&lt;p&gt;Most developers never implement a hash map, a heap, or a binary search tree. They reach for &lt;code&gt;std::unordered_map&lt;/code&gt;, &lt;code&gt;std::priority_queue&lt;/code&gt;, &lt;code&gt;std::map&lt;/code&gt;, and move on. That is correct for shipping code.&lt;/p&gt;

&lt;p&gt;But it leaves a gap. When you have only ever &lt;em&gt;used&lt;/em&gt; a heap, "k-th largest in O(n log k)" is a magic phrase. When you have &lt;em&gt;built&lt;/em&gt; one, it is obvious: a size-k heap, push, pop when it overflows, done.&lt;/p&gt;

&lt;p&gt;The trick is to build each structure exactly once, with tests checking every step, and then go back to using the standard library forever. The point is not to reinvent the wheel in production. The point is that after you have built the wheel, you can see it turning inside everyone else's code.&lt;/p&gt;

&lt;p&gt;A short list worth doing by hand at least once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dynamic array (grow, amortized push) so &lt;code&gt;O(1) amortized&lt;/code&gt; stops being a phrase.&lt;/li&gt;
&lt;li&gt;A hash map with collision handling so you trust the &lt;code&gt;O(1) average&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A binary heap so top-K and Dijkstra stop being mysterious.&lt;/li&gt;
&lt;li&gt;A binary search tree so "inorder is sorted" is something you have seen, not memorized.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do it in a compiled language and let the compiler and a test harness be your reviewer. The friction is the lesson.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Build all of these by hand, in C++, with a compiler grading every step: &lt;a href="https://iwtlp.com/track/dsa-cpp" rel="noopener noreferrer"&gt;https://iwtlp.com/track/dsa-cpp&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dsa</category>
      <category>cpp</category>
      <category>interview</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
