<?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: Saksham Solanki</title>
    <description>The latest articles on DEV Community by Saksham Solanki (@sardanios).</description>
    <link>https://dev.to/sardanios</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%2F3475890%2Fec3c5464-ca5a-48e9-b996-86b367a28674.jpg</url>
      <title>DEV Community: Saksham Solanki</title>
      <link>https://dev.to/sardanios</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sardanios"/>
    <language>en</language>
    <item>
      <title>Python Is Overrated? The REAL Best Language for Web Scraping</title>
      <dc:creator>Saksham Solanki</dc:creator>
      <pubDate>Tue, 30 Dec 2025 13:49:54 +0000</pubDate>
      <link>https://dev.to/sardanios/python-is-overrated-the-real-best-language-for-web-scraping-o5a</link>
      <guid>https://dev.to/sardanios/python-is-overrated-the-real-best-language-for-web-scraping-o5a</guid>
      <description>&lt;p&gt;“Is there any library which won’t suck when I’m deploying?”&lt;br&gt;
That’s a question I used to ask for at least 90% of my projects.&lt;/p&gt;

&lt;p&gt;Setting up undetected-chromedriver on macOS used to be pure pain for me. And since many clients didn’t really understand how all of this worked, they wanted a GUI to interact with. Of course, Python has libraries to build GUIs… but most of them look like they’re straight out of the early 2000s.&lt;/p&gt;

&lt;p&gt;So I started looking for alternatives and eventually landed on JavaScript. It had better scraping libraries like Puppeteer, deployment felt smoother, and it’s already the primary language for web applications, so things just fit together better.&lt;/p&gt;

&lt;p&gt;But then came the other limitations.&lt;/p&gt;

&lt;p&gt;Data cleaning wasn’t great.&lt;br&gt;
There were weird quirks, runtime oddities, and overall I just didn’t enjoy writing code in it as much. Scaling in js was also difficult, definitely doable but harder to optimize.&lt;/p&gt;

&lt;p&gt;That’s when I discovered Golang.&lt;/p&gt;

&lt;p&gt;It's community is small and is still growing, but it absolutely wins when it comes to speed, reliability, concurrency, and deployment. Goroutines and channels make concurrent workloads way easier as compared to threads or async-heavy code in other ecosystems.&lt;/p&gt;

&lt;p&gt;Create a single binary and that's it.&lt;br&gt;
No virtual environments, no dependency hell. Just copy it to whatever platform you want and run it.&lt;/p&gt;

&lt;p&gt;That was a gold find for me.&lt;/p&gt;

&lt;p&gt;Go is extremely good for networking, has solid support for web automation through libraries like chromedp and rod, and when it comes to scaling, Go performs far better than Python specially in CPU-bound and high-concurrency workloads. It has a predictable memory footprint too also the startup times are faster, and it handles thousands of concurrent connections without chugging resources unnecessarily.&lt;/p&gt;

&lt;p&gt;You can argue with me that Python's got more libs, and that TypeScript makes JavaScript more reliable. And sure, I agree. But the raw performance, simplicity of deployment, and consistency Go provides are hard to match. You can even build IPC-based communication layers and easily integrate Go services with other languages for frontends or specialized tooling.&lt;/p&gt;

&lt;p&gt;Yes, Go has comparatively smaller ecosystem.&lt;br&gt;
Yes, there are fewer libraries right now.&lt;/p&gt;

&lt;p&gt;But if it’s supported well and adopted by more developers, Go can very much challenge Python’s dominance in web scraping, especially for large-scale, production-grade systems where performance, stability, and deployment actually matter.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>web</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Dig at Berghain Coding Challenge</title>
      <dc:creator>Saksham Solanki</dc:creator>
      <pubDate>Wed, 03 Sep 2025 17:34:29 +0000</pubDate>
      <link>https://dev.to/sardanios/day-1-dig-at-berghain-coding-challenge-2pc9</link>
      <guid>https://dev.to/sardanios/day-1-dig-at-berghain-coding-challenge-2pc9</guid>
      <description>&lt;p&gt;Ever wondered what it's like to be the bouncer at the world's most exclusive nightclub? &lt;strong&gt;Listen Labs&lt;/strong&gt; has created a fascinating algorithmic challenge that lets you experience just that! Minus the music and questionable fashion choices. The &lt;a href="https://berghain.challenges.listenlabs.ai/" rel="noopener noreferrer"&gt;Berghain Challenge&lt;/a&gt; is a brilliant constraint satisfaction problem disguised as a nightclub simulation, and I've got to hand it to the creators, this is one addictive optimization puzzle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge: More Than Just a Velvet Rope
&lt;/h2&gt;

&lt;p&gt;The Berghain Challenge presents you with a simple task: fill a venue with exactly 1000 people while meeting specific demographic quotas. People arrive sequentially with binary attributes (young/old, well-dressed/casual, techno-lover/not, etc.), and you must make immediate accept/reject decisions. No take-backs.&lt;/p&gt;

&lt;p&gt;You're scored on how many people you reject before filling the venue. Less rejections = better score.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Impressions: The Naive Approach
&lt;/h2&gt;

&lt;p&gt;When I first encountered this challenge, my instinct was to be that friendly bouncer who lets everyone in. Spoiler alert: that doesn't work when you need 600 young people out of 1000 spots as well as 600 well dressed, but only 32.25% of the crowd is actually young. The math doesn't lie - you need to be selective.&lt;br&gt;
My initial attempts were... educational. Accept everyone who meets any constraint? Venue fills up with the wrong mix. Be too picky? Hit 2000-3000 rejections before filling the venue. There's a sweet spot, and finding it requires strategy.&lt;/p&gt;

&lt;p&gt;The Strategy: Proportional Filling with a Safety Buffer&lt;br&gt;
After several iterations, I developed what I call the "Proportional Filling with Buffer" strategy. &lt;br&gt;
Here's the core insight:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pythonvenue_filled_percent = admitted_count / 1000&lt;br&gt;
target_progress = min(venue_filled_percent + 0.10, 1.0)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The idea is elegant: maintain each attribute at your current venue fill percentage plus a 10% buffer. If you're 40% full, you want each constraint to be at least 50% complete. This buffer is crucial - it prevents the desperate scramble when you're at 950 admissions and still need 50 more young people.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Implementation: Three-Phase Execution
&lt;/h2&gt;

&lt;p&gt;My bot operates in three distinct phases:&lt;br&gt;
Phase 1: Early Aggression (0-300 admissions)&lt;br&gt;
&lt;code&gt;# Aggressively accept valuable individuals&lt;br&gt;
if person_has_multiple_attributes:&lt;br&gt;
    return ACCEPT  # These people are gold&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Early on, we can afford to be somewhat liberal with acceptances, especially for people with multiple desired attributes. They're rare (only ~6.8% have both young AND well-dressed in Scenario 1) and incredibly valuable.&lt;/p&gt;

&lt;p&gt;Phase 2: Strategic Balance (300-800 admissions)&lt;br&gt;
&lt;code&gt;# Check if person helps maintain proportions&lt;br&gt;
for attribute in constraints:&lt;br&gt;
    current_progress = attribute_counts[attribute] / constraints[attribute]&lt;br&gt;
    if person_has_attribute and current_progress &amp;lt; target_progress:&lt;br&gt;
        return ACCEPT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is where the magic happens. We're constantly recalculating whether accepting someone keeps us on track. The 10% buffer means we're never in crisis mode - we're always slightly ahead of where we need to be.&lt;/p&gt;

&lt;p&gt;Phase 3: Endgame Flexibility (900+ admissions)&lt;br&gt;
&lt;code&gt;# Constraints met? Fill remaining spots&lt;br&gt;
if all_constraints_satisfied:&lt;br&gt;
    return ACCEPT  # Take anyone at this point&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once we've hit our quotas, it's party time - everyone gets in until we hit capacity.&lt;/p&gt;

&lt;p&gt;The Secret Sauce: Strategic Rejection&lt;br&gt;
Here's what separates good strategies from great ones: knowing who to reject and when. In Scenario 1, about 41.7% of people have neither desired attribute. These are your strategic rejection candidates:&lt;br&gt;
&lt;code&gt;# Strategic rejection of "neither" category&lt;br&gt;
if has_no_attributes and min_progress &amp;gt; venue_filled + threshold:&lt;br&gt;
    return REJECT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But here's the kicker - you can't reject them all immediately. You need some flexibility for the endgame. My strategy uses a dynamic threshold that adjusts based on rejection count and progress differential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;With this approach, I consistently achieve:&lt;/p&gt;

&lt;p&gt;Scenario 1: 900-950 rejections (compared to the optimal ~770-800)&lt;br&gt;
Acceptance Rate: 51-53%&lt;br&gt;
Success Rate: 100% constraint satisfaction&lt;br&gt;
Total Decisions: ~1950&lt;/p&gt;

&lt;p&gt;Is it the absolute best? No. I've since developed strategies that can go below 750 rejections. But this initial approach taught me valuable lessons about online decision-making, constraint satisfaction, and the importance of safety buffers in optimization problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Insights
&lt;/h2&gt;

&lt;p&gt;What makes this challenge particularly interesting from an algorithmic perspective is that it's an online constraint satisfaction problem with:&lt;/p&gt;

&lt;p&gt;No lookahead: You can't see the queue, making this a true online algorithm challenge&lt;br&gt;
Stochastic input: The attribute distribution is random but follows known probabilities&lt;br&gt;
Multiple constraints: Balancing multiple quotas simultaneously requires careful tracking&lt;br&gt;
Hard capacity limit: Exactly 1000 spots, no more, no less&lt;/p&gt;

&lt;p&gt;The optimal solution likely involves more sophisticated techniques like:&lt;/p&gt;

&lt;p&gt;Dynamic programming for threshold calculation&lt;br&gt;
Bayesian updating of attribute probabilities&lt;br&gt;
Linear programming-inspired dual variable pricing&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The Berghain Challenge is a masterclass in gamified algorithm design. It's accessible enough that you can get started with basic if-then logic, but deep enough that optimizing your solution requires genuine algorithmic thinking. Huge props to the &lt;strong&gt;Listen Labs&lt;/strong&gt; team for creating this engaging challenge - it's problems like these that make algorithm design feel less like homework and more like solving a really satisfying puzzle.&lt;/p&gt;

&lt;p&gt;Whether you're aiming for the leaderboard top spot or just trying to beat your personal best, this challenge offers a perfect playground for exploring optimization strategies.&lt;/p&gt;

&lt;p&gt;Challenge link: &lt;a href="https://berghain.challenges.listenlabs.ai/" rel="noopener noreferrer"&gt;https://berghain.challenges.listenlabs.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you tackled the Berghain Challenge? What strategies worked for you? Drop a comment below - I'd love to compare notes on optimization approaches!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>algorithms</category>
      <category>learning</category>
    </item>
    <item>
      <title>I built a simple todo app that actually gets out of your way</title>
      <dc:creator>Saksham Solanki</dc:creator>
      <pubDate>Tue, 02 Sep 2025 13:26:15 +0000</pubDate>
      <link>https://dev.to/sardanios/i-built-a-simple-todo-app-that-actually-gets-out-of-your-way-665</link>
      <guid>https://dev.to/sardanios/i-built-a-simple-todo-app-that-actually-gets-out-of-your-way-665</guid>
      <description>&lt;p&gt;You download a productivity app to track simple tasks, then spend 20 minutes setting up projects, categories, and integrations just to add "buy milk" to a list.&lt;/p&gt;

&lt;p&gt;I got fed up and built &lt;a href="https://github.com/sardanioss/zenith.git" rel="noopener noreferrer"&gt;Zenith&lt;/a&gt;  - a task manager that strips away everything except what you actually need.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Modern Todo Apps
&lt;/h2&gt;

&lt;p&gt;Most task managers suffer from feature creep. They want to be project management systems, team platforms, and life coaches all in one. The result? Apps that take longer to set up than your actual tasks.&lt;/p&gt;

&lt;p&gt;What frustrated me most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex onboarding and account creation&lt;/li&gt;
&lt;li&gt;Feature overload (subtasks, dependencies, custom fields)&lt;/li&gt;
&lt;li&gt;Web-based limitations requiring constant internet&lt;/li&gt;
&lt;li&gt;Too many ways to organize one simple task&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Built Instead
&lt;/h2&gt;

&lt;p&gt;Zenith is a desktop app with one philosophy: &lt;strong&gt;task management should be fast and simple&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual calendar&lt;/strong&gt; - Click any date to add tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag &amp;amp; drop&lt;/strong&gt; - Move tasks between dates easily
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click completion&lt;/strong&gt; - No ceremony, just check it off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color coding&lt;/strong&gt; - Six colors for visual organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics dashboard&lt;/strong&gt; - Simple productivity trends&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I Left Out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No user accounts or cloud sync&lt;/li&gt;
&lt;li&gt;No team collaboration &lt;/li&gt;
&lt;li&gt;No complex project hierarchies&lt;/li&gt;
&lt;li&gt;No integrations with dozens of services&lt;/li&gt;
&lt;li&gt;No subscription pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Stack
&lt;/h2&gt;

&lt;p&gt;I kept it as simple as the UX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Vanilla JavaScript, HTML5, CSS3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Express.js with REST API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: SQLite (single file)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop&lt;/strong&gt;: Electron for cross-platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire database is one table with 12 fields. The API is 5 endpoints. That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Philosophy
&lt;/h2&gt;

&lt;p&gt;Every feature decision came down to: "Does this help someone quickly add, complete, or reschedule a task?"&lt;/p&gt;

&lt;p&gt;If no, it didn't make it in. This led to interesting constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No subtasks (break complex tasks into separate ones)&lt;/li&gt;
&lt;li&gt;Same-day deadlines only (focus on today)&lt;/li&gt;
&lt;li&gt;Limited time estimates (30 min to 8 hours)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why It Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It's fast.&lt;/strong&gt; Adding a task takes 5 seconds vs navigating menus and forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It stays hidden.&lt;/strong&gt; No upgrade prompts, no feature tips, no social elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints help.&lt;/strong&gt; Fewer options make you more decisive about priorities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Probably nothing major. The whole point is that it's done. It does what it needs to do.&lt;br&gt;
I might fix bugs, but I won't add AI assistants or any bs. Zenith will remain a tool that gets out of your way.&lt;/p&gt;

&lt;p&gt;Try Zenith: &lt;a href="https://github.com/sardanioss/zenith" rel="noopener noreferrer"&gt;https://github.com/sardanioss/zenith&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for people who believe task management should be simple, not complicated.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
