<?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: Benny</title>
    <description>The latest articles on DEV Community by Benny (@bennykillua).</description>
    <link>https://dev.to/bennykillua</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%2F608386%2Fcec26f41-9540-4c32-87cf-e1fb1216269f.jpg</url>
      <title>DEV Community: Benny</title>
      <link>https://dev.to/bennykillua</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bennykillua"/>
    <language>en</language>
    <item>
      <title>A CTO's 5-phase roadmap to AI-native internal tools (and why most pilots stall)</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Wed, 10 Dec 2025 07:20:00 +0000</pubDate>
      <link>https://dev.to/bennykillua/a-ctos-5-phase-roadmap-to-ai-native-internal-tools-and-why-most-pilots-stall-5ea5</link>
      <guid>https://dev.to/bennykillua/a-ctos-5-phase-roadmap-to-ai-native-internal-tools-and-why-most-pilots-stall-5ea5</guid>
      <description>&lt;p&gt;Executives keep declaring that AI is the future. &lt;a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai" rel="noopener noreferrer"&gt;Reports&lt;/a&gt; show that adoption is rising. Yet only a tiny fraction of enterprises ever reach real impact. The numbers look impressive until you ask why so many AI pilots stall before they scale.&lt;/p&gt;

&lt;p&gt;In our conversation with &lt;a href="https://www.linkedin.com/in/22shubham/" rel="noopener noreferrer"&gt;Shubham Gupta&lt;/a&gt;, CTO at ToolJet, he argued that the real barrier is not model quality or governance. It is the quiet weight of operational debt that sits inside every enterprise. Most critical workflows still run on spreadsheets, disconnected files, and email threads. Gupta put it bluntly that "&lt;em&gt;Our biggest competitor is Excel.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;Once you see the problem through that lens, a sharper question appears. &lt;strong&gt;If internal operations remain stuck in manual systems, what does it take for an enterprise to adopt AI native internal tools at scale?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article brings together industry research and Gupta’s firsthand experience to answer that question. It explores the obstacles slowing internal AI adoption and the role of AI native internal tools in removing those obstacles. It then lays out the five-phase roadmap Gupta believes leaders can use to achieve real progress rather than more pilots.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the industry currently gets wrong about internal AI adoption
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://t.me/c/2439506019/560" rel="noopener noreferrer"&gt;IBM&lt;/a&gt; reported that enterprise-wide AI adoption stalls due to poor model customization, complex infrastructure, and regulatory requirements. Gupta argues that the real reasons for internal AI adoption failure are legacy systems, fragmented processes, and deprioritization of internal tool development. &lt;/p&gt;

&lt;p&gt;For example, team approvals for new product launches still move through email threads. Employees cannot act on data buried in unstructured processes, and the workflows that AI should automate still exist in spreadsheets and email chains.  &lt;/p&gt;

&lt;p&gt;The industry sees AI sophistication as the main hurdle, but Gupta insists that the true limitation to internal AI adoption is the lack of software. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Companies with large operational requirements need software for employees to do their work more efficiently," said Gupta. "Imagine there are about 5,000 employees, in the absence of proper internal software, chaos will ensue," he added. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Relegation of internal tools is another adoption obstacle that industry reports often overlook, and Gupta says most enterprises have yet to overcome. With engineers working on customer-facing assets, internal tool development often takes a back seat. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Engineering teams are always juggling between delivering consumer-facing products and prioritizing these internal tools, which ultimately causes a lot of operational inefficiency," Gupta shared. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To effectively adopt AI internally, organizations must update their manual practices and increase development time for internal software using low-code platforms like ToolJet. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why internal tools are the natural first home for AI
&lt;/h2&gt;

&lt;p&gt;Analysts often point out that AI succeeds fastest in environments where work follows a repeatable pattern. Gupta sees the same reality inside enterprises.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Internal tools are repetitive and do not require a lot of contextual thinking, which makes AI well placed to build and manage them."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Employee sentiments also support this direction. A survey by &lt;a href="https://talkerresearch.com/how-could-ai-help-workers-regain-lost-productivity/" rel="noopener noreferrer"&gt;Talker Research&lt;/a&gt; revealed that 62% of employees want to use AI in their roles to sort data in spreadsheets. Routine tasks such as data sorting, CRUD operations, approval chains, and inventory tracking are examples of workflows that follow a fixed pattern. They are the logical starting point to introduce AI-powered internal tools because they generate compounding value quickly and provide a deterministic process that enables AI algorithms to function reliably. &lt;/p&gt;

&lt;p&gt;The industry view and Gupta’s experience point toward the same starting point for AI adoption. Enterprises waste momentum when they try to automate strategic or ambiguous work first. Gupta suggests focusing on the internal tools that already run on predictable workflows because these are the environments where AI produces reliable gains and compounds value quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The determinism challenge most AI tool builders ignore
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9sq45smdr9l3qoe992e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9sq45smdr9l3qoe992e.png" alt=" " width="800" height="530"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Determinism in AI-native internal tools&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enterprises fear AI's inherently non-deterministic nature. Executives want consistent and auditable outcomes from the AI tools they adopt within their organizations because AI unpredictability triggers mistrust, poses compliance issues, and can harm decision-making. &lt;/p&gt;

&lt;p&gt;For example, a single hallucinated permission can expose an entire customer dataset. Analysts focus on establishing evals and guardrails, but the industry still lacks a shared standard for how they should work. &lt;/p&gt;

&lt;p&gt;Gupta says the solution is an architecture with three interconnected layers, as illustrated in the image above: a multi-agent structure, an eval system, and a human-in-the-loop process. Determinism increases when enterprises break automation into smaller, single-responsibility agents. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you spread every AI action into multiple single responsibility prompts, the agent's output quality improves," he said. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second layer, an eval system, serves as a feedback loop that ensures behavioral consistency, security, and reliability. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It puts guardrails in place, so when AI responses fall below a certain standard, organizations can re-loop their agents," Gupta shared. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The final layer, human checkpoints, is what locks the architecture into place. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"No AI action on data should be performed automatically. A human should always authorize and test those actions in a development staging environment before they go to a production environment," Gupta highlighted. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This approach to achieving predictable AI outcomes should serve as a framework for enterprises that want to build trustworthy AI-powered internal tools. But tackling non-determinism is only one part of mitigating the vulnerabilities that can affect an organization's trust in AI tools. &lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise architecture is the real battlefield
&lt;/h2&gt;

&lt;p&gt;The hardest part of AI adoption isn't the model, but the architecture that surrounds it and the expectations enterprise teams refuse to compromise.&lt;/p&gt;

&lt;p&gt;Enterprises want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data control for proprietary data and isolated tools that span different departments &lt;/li&gt;
&lt;li&gt;Governance to ensure a tool works transparently and meets regulatory requirements&lt;/li&gt;
&lt;li&gt;Predictable Software Development Life Cycle (SDLC) for engineering teams that are resistant to disruptive workflows &lt;/li&gt;
&lt;li&gt;Integration into existing systems to accommodate tailored workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analysts believe AI tools will replace traditional workflows within enterprises. Rather than outright replacement, Gupta contends that internal AI tooling must respect an organization's existing architecture, protect that foundation, and extend the system when it requires further customization. &lt;/p&gt;

&lt;p&gt;In practice, the right internal AI tools offer self-hosting options, provide flexible SSO, and support extensibility through code, plugins, or third-party integrations. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You can self-host ToolJet internally inside your VPN or deploy it in your existing cloud services to make sure that none of your sensitive data escapes or reaches our servers. The data stays in your own cloud or database, so you can completely air-gap ToolJet inside your network," Gupta noted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Opinionated platforms lock organizations into vendor-controlled environments, which risks data exposure, while enterprise-friendly AI tools give organizations full control over where their data resides. &lt;/p&gt;

&lt;p&gt;Internal tools often span departments, and each team might build its own application while still requiring cross-departmental coordination. Enterprises want unified access control, and a strong Single Sign-On (SSO) provides secure access to the tools. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Whatever SSO a company supports is supported by ToolJet. Whether they prefer multiple SSOs for multiple departmental tools or a single SSO to rule them all, that also works with ToolJet," said Gupta. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Opinionated platforms typically require organizations to conform to their specific authentication protocols, while adaptive AI tools integrate with multiple identity providers.  &lt;/p&gt;

&lt;p&gt;Respecting engineering workflows is another priority for internal development teams that have established processes. Gupta explained, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Engineering teams are very picky with tools because they have a certain way of working and they don't enjoy people messing with it."  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Opinionated platforms dictate a new SDLC model, but flexible AI platforms like ToolJet allow engineers to follow their own SDLC while the platform adopts it. Enterprise AI tooling succeeds when platforms adapt to an organization’s constraints, rather than fighting them. &lt;/p&gt;

&lt;p&gt;Understanding the real obstacles to internal AI adoption is an important first step, but enterprises also need an action plan that actually drives adoption. &lt;/p&gt;

&lt;h2&gt;
  
  
  The roadmap to adopting AI native internal tools
&lt;/h2&gt;

&lt;p&gt;Leadership wants results with AI, but often without a clear strategy or a full picture of how to achieve it. Gupta provided a phased approach for business leaders to know where to begin the adoption process and how to scale it across their organization.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvik81n98x68g3cmxck0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvik81n98x68g3cmxck0v.png" alt=" " width="800" height="815"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Roadmap to adopting AI native internal tools&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Audit where manual work still lives&lt;/strong&gt;&lt;br&gt;
Industry reports often advise executives to conduct an AI readiness assessment that evaluates whether their organization is ready to integrate and adopt AI. But this assessment is a broad and ongoing process. &lt;/p&gt;

&lt;p&gt;Instead, Gupta recommends that executives revisit the manual, high-friction, and data-heavy parts of their existing workflows, then redesign them so AI becomes a natural part of the lifecycle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check how many people are handling a bunch of Excel sheets overflowing with customer records or transactional data in your company," he said. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Engage with teams across product, engineering, operations, or sales departments to identify bottlenecks. For example, customer success teams may be losing track of approval requests buried in emails. &lt;/p&gt;

&lt;p&gt;Gupta suggested this is how to spot inefficiencies and opportunities for automation. Transforming this manual process into an internal software will ensure that every request has timestamps and owners attached. Teams still make the higher-level decisions, but with an AI-powered internal tool, they start benefitting from automated routine tasks and smoother feedback. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Ship the first AI-generated internal app fast&lt;/strong&gt;&lt;br&gt;
Analysts say business leaders should define Key Performance Indicators (KPIs) before introducing an internal AI tool. While KPIs outline business objectives, they can create an illusion of clarity. Instead, Gupta says executives should choose one painful workflow and build a solution fast using platforms like ToolJet, which cut time-to-app through natural-language app creation. &lt;/p&gt;

&lt;p&gt;The real success metric to track is "shipping a working internal app in one to two weeks, depending on the use case. Then, iterate based on feedback," he said. When employees experience optimized workflows and regain time to focus on higher-value work, internal tool adoption gains momentum. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Create a repeatable build system&lt;/strong&gt;&lt;br&gt;
Industry experts debate which build system is superior between AI, low-code, and pro-code development. But Gupta says executives must approach their decision as a development spectrum. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Some enterprises need AI-powered development with a prompt-specific approach for rapid prototyping. Others want low-code solutions, where non-technical teams can drag-and-drop and customize pre-built components in a visual builder. Engineering teams may want to customize features even further and add custom connectors for specific functionalities using pro-code development," he said. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A practical approach is to reduce development backlogs and tool build time using AI and low-code platforms, then leverage the flexibility and precision of pro-code for custom workflows and complex features. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4: Harden with governance and access control&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.liminal.ai/blog/enterprise-ai-governance-guide" rel="noopener noreferrer"&gt;Reports&lt;/a&gt; show that the timeline for implementing and scaling AI governance in an enterprise can take 6 to 18 months. Gupta suggests a different approach: build trust into the tool from day one through determinism and access control. Start with Role-Based Access Control (RBAC) for tools that handle significant business processes, manage sensitive data, and report critical information. IT teams should limit users' permissions to only what is necessary to perform their roles. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If a specific team doesn't need to have access to a tool, they shouldn't have access to it because the principle of least privilege and regulatory adherence is very critical to large enterprises," said Gupta. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, implement SSO early with strong encryption to protect authentication data. Above all, maintain human ownership throughout the entire lifecycle of developing and scaling AI internal tools. Human employees should validate decisions and provide ethical oversight, while AI apps or agents handle the operational load and execution. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 5: Scale through internal evangelism&lt;/strong&gt;&lt;br&gt;
Industry reports often attribute poor internal tool adoption to governance. But Gupta challenges this view, arguing that scaling is a value-proof problem. When teams can see a tool's value quickly, adoption spreads naturally, and scaling becomes feasible. &lt;/p&gt;

&lt;p&gt;Gupta encouraged executives to "regularly share wins and updates on a successful internal tool to build trust, and create internal programs like Hackathons which reward employees who actively build tools that contribute to enterprise-wide integration." &lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/superagency-in-the-workplace-empowering-people-to-unlock-ais-full-potential-at-work" rel="noopener noreferrer"&gt;McKinsey&lt;/a&gt; survey reinforces Gupta's suggestions, stating that "employees believe access to AI tools in betas or pilots, along with incentives such as financial rewards and recognition, will accelerate AI adoption." A successful pilot within one team will encourage a culture of experimentation, where employees feel empowered to explore AI solutions across organizational processes. &lt;/p&gt;

&lt;p&gt;Gupta shared that the ToolJet team uses its own platform internally across different business functions, achieving productivity gains and reducing development costs. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We used ToolJet to build an internal CRM that handles licensing keys creation, payments, refunds, and recurring invoices for our customers. This used to take a lot of our manual effort, and if we had to build this product from scratch, it would have taken us another two months. But with ToolJet, we were able to launch the product faster, and our dev team spends more time on actual customer-facing products." &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He also shared that the team built their release notes engine on ToolJet in one week. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We evaluated external software, but it was costing us upwards of $1,000 a month. So we decided to build internally using ToolJet, and it took us a week to spin it off. And now we are completely relying on our internal software to manage and publish release notes." &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Enterprises that build internal AI tools early for high-friction tasks will gain faster data analysis, reduced manual error, clearer communication, improved IT support, and productive employees who can focus on more strategic tasks. &lt;/p&gt;

&lt;h2&gt;
  
  
  What it means to build an AI native internal tools strategy
&lt;/h2&gt;

&lt;p&gt;Organizations that want to be ready for an AI-driven future must start with their internal systems. The roadmap presented in this article provides executives and team leads with concrete steps towards building an AI-native internal tooling network that puts them at an advantage to win at AI.&lt;/p&gt;

&lt;p&gt;It doesn't require a radical company-wide overhaul. The key is building targeted internal tools that automate mechanical, multi-step work to compound wins quickly. Then, teams can iteratively expand those tools into well-scoped tasks while investing in guardrails. &lt;/p&gt;

&lt;p&gt;The leaders who successfully implement this roadmap will move from pilots to full-scale impact. &lt;/p&gt;

</description>
      <category>internaltool</category>
      <category>ai</category>
      <category>architecture</category>
      <category>roadmap</category>
    </item>
    <item>
      <title>Vibe Coding Isn’t Dumb — You’re Just Overthinking It (Especially With Tools Like ToolJet &amp; Lovable Around)</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Sat, 29 Nov 2025 20:42:34 +0000</pubDate>
      <link>https://dev.to/bennykillua/vibe-coding-isnt-dumb-youre-just-overthinking-it-especially-with-tools-like-tooljet-lovable-d29</link>
      <guid>https://dev.to/bennykillua/vibe-coding-isnt-dumb-youre-just-overthinking-it-especially-with-tools-like-tooljet-lovable-d29</guid>
      <description>&lt;p&gt;There’s a growing sentiment among developers today about “vibe coding.” But most of the pushback comes from folks who still believe every project needs enterprise-grade architecture from day one. The reality is simple: if your goal is to ship, not philosophize, vibe coding with AI is one of the fastest ways to get ideas into the world.&lt;/p&gt;

&lt;p&gt;A recent post broke down why and how AI works best when you remove friction. By friction, I mean mainstream stacks, short PRDs, version control, and clean context resets. &lt;/p&gt;

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

&lt;p&gt;But here’s the part most people miss. Low-code and AI-native builders are literally designed for this workflow. Tools like &lt;a href="https://blog.tooljet.ai/replit-vs-lovable/" rel="noopener noreferrer"&gt;ToolJet and Lovable&lt;/a&gt; take those same vibe-coding principles and bake them directly into the development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where ToolJet Shines
&lt;/h2&gt;

&lt;p&gt;If you’re building something with real internal logic, workflows, or data operations, ToolJet thrives. It’s not just a “drag-and-drop UI builder.” Its AI agents understand business rules, connect to databases instantly, generate API integrations, and help scaffold real features without you wrestling with boilerplate.&lt;/p&gt;

&lt;p&gt;It make the “use a mainstream stack + provide a clear PRD + ship step by step” workflow feel natural. You give it structure, and it gives you production-ready apps that don’t collapse under real usage.&lt;/p&gt;

&lt;p&gt;This is vibe coding for serious apps. The kind you internal team can use enterprise wide.&lt;/p&gt;

&lt;p&gt;Where Lovable Shines&lt;/p&gt;

&lt;p&gt;Lovable is the opposite energy in the best way. It’s the perfect expression of pure vibe coding:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;type an idea → get an app → iterate with natural language.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s fast, playful, and incredible for prototypes, validation, hackathon-style creativity, and “I just want to see this working in five minutes” moments.&lt;/p&gt;

&lt;p&gt;When the screenshot says:&lt;/p&gt;

&lt;p&gt;“Pick a mainstream stack so AI gets it right”&lt;/p&gt;

&lt;p&gt;Lovable basically automates that decision for you. It handles the stack, scaffolding, routing, structure — so you stay focused on the idea.&lt;/p&gt;

&lt;p&gt;Vibes &amp;gt; setup.&lt;/p&gt;

&lt;p&gt;The funny thing is: vibe coding doesn’t mean you avoid complexity — it means you stage it.&lt;/p&gt;

&lt;p&gt;So maybe start in Lovable to get the first version fast.&lt;/p&gt;

&lt;p&gt;Move to ToolJet when your prototype becomes a real internal product.&lt;/p&gt;

&lt;p&gt;Or stay in Lovable if your whole goal was speed, not enterprise depth.&lt;/p&gt;

&lt;p&gt;Both tools turn the guidelines from the original post into practical, repeatable workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Vibe coding isn’t “lazy dev.”&lt;br&gt;
It’s a modern mindset. ship fast, reduce friction, give AI constraints, and build only what matters.&lt;/p&gt;

&lt;p&gt;ToolJet and Lovable amplify that mindset. Smartest developers aren’t the ones writing everything from scratch. They’re the ones who know how to combine AI, low-code, and clarity to ship 10× faster without losing their sanity.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>lovable</category>
      <category>tooljet</category>
    </item>
    <item>
      <title>I tested ToolJet’s Agent and here is what I found!</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Sat, 22 Nov 2025 15:19:00 +0000</pubDate>
      <link>https://dev.to/bennykillua/i-tested-tooljets-agent-and-here-is-what-i-found-hhb</link>
      <guid>https://dev.to/bennykillua/i-tested-tooljets-agent-and-here-is-what-i-found-hhb</guid>
      <description>&lt;p&gt;I spent last weekend playing with ToolJet’s new AI agents and… low-code might actually be dead in the “holy crap, this is what we’ve been waiting for” way.&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;

&lt;p&gt;I ran a nightmare prompt that would've normally triggered a week of meetings and 20 Jira tickets:&lt;/p&gt;

&lt;p&gt;“Build an internal tool for our sales team to manage customer contracts: upload PDFs, extract key dates with OCR, route approvals with RBAC, send reminders, and log everything.”&lt;/p&gt;

&lt;p&gt;No schema. No PRD. No wireframes. Just &lt;a href="https://blog.tooljet.ai/low-code-had-its-moment-announcing-future-of-tooljet/" rel="noopener noreferrer"&gt;the prompt/sentence above&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;And here’s what the ToolJet agent team gave me in minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A full PostgreSQL schema with normalized tables, foreign keys, indexes, and a scalable structure&lt;/li&gt;
&lt;li&gt;A real UI — file uploads, searchable tables, and a Kanban approval board&lt;/li&gt;
&lt;li&gt;RBAC baked in with viewer/editor/admin roles without config hell&lt;/li&gt;
&lt;li&gt;and Audit logs for every action, exportable to CSV, and that comes with Slack/Zapier notifications for approvals + reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly? It felt like working with a full-stack team without getting burned out!&lt;/p&gt;

&lt;p&gt;And that got me thinking.&lt;/p&gt;

&lt;p&gt;These agents aren’t “GPT wrapped in a UI.” They behave like specialized teammates. There is an agent for DB design, UI scaffolding, API wiring, logic building, debugging, etc. They talk to each other, hand off tasks, and refine.&lt;/p&gt;

&lt;p&gt;That’s the part that feels like the real shift.&lt;/p&gt;

&lt;p&gt;Want receipts? Here are the demos that convinced me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=EiqZJufcNl8" rel="noopener noreferrer"&gt;Build AI Enterprise Apps in Minutes with ToolJet!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ejSQSUv0lHQ" rel="noopener noreferrer"&gt;Code Generators and Low-Code Are Great… Until ToolJet Agents Show Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8o1hSc0G2XI" rel="noopener noreferrer"&gt;ToolJet.ai Tutorial for Beginners — Build AI Apps FAST!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My honest take after testing everything from Retool to Bubble to AI coders. Most tools break when you throw enterprise complexity at them because enterprise tools need permissions, environments, audit trails, and integrations.&lt;/p&gt;

&lt;p&gt;ToolJet’s agent system didn’t blink. It felt scalable, deliberate, and surprisingly “developer-aware.”&lt;/p&gt;

&lt;p&gt;So if you’re drowning in CRUD requests, or you’ve shipped one too many “temporary” internal tools that outlived your will to maintain them, give &lt;a href="https://blog.tooljet.ai/low-code-had-its-moment-announcing-future-of-tooljet/" rel="noopener noreferrer"&gt;ToolJet AI a shot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your weekend (and sanity) will thank you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>tooljet</category>
      <category>claude</category>
    </item>
    <item>
      <title>Building a Competitive 'Deal Hunter' Agent Using n8n + BrightData Real-Time Web Data</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Sun, 31 Aug 2025 13:15:59 +0000</pubDate>
      <link>https://dev.to/bennykillua/building-a-competitive-deal-hunter-agent-using-n8n-brightdata-real-time-web-data-42b6</link>
      <guid>https://dev.to/bennykillua/building-a-competitive-deal-hunter-agent-using-n8n-brightdata-real-time-web-data-42b6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/brightdata-n8n-2025-08-13"&gt;AI Agents Challenge powered by n8n and Bright Data&lt;/a&gt;&lt;/em&gt; and my first n8n workflow.&lt;/p&gt;

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

&lt;p&gt;Searching for deals manually can be time-consuming and frustrating. Most of the time, this costs us as we often miss out on the best prices and limited-time offers. This AI agent solves this problem by automating the deal-hunting process and providing a single, intelligent interface for finding the best discounts.&lt;/p&gt;

&lt;p&gt;How It Works&lt;br&gt;
This AI agent, built with n8n and powered by Bright Data, is designed for efficient web scraping. The agent then uses the Bright Data n8n Verified Node as a tool to perform real-time web scrapes for the requested product based on the user's chat message. The output (the scraped data) is then presented to the user in a clear, friendly, and conversational summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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

&lt;p&gt;Agent link: &lt;a href="http://localhost:5678/workflow/2hIkozBxX4QEcxyZ" rel="noopener noreferrer"&gt;http://localhost:5678/workflow/2hIkozBxX4QEcxyZ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo Video: &lt;a href="https://youtu.be/TGljGiiHpRo" rel="noopener noreferrer"&gt;https://youtu.be/TGljGiiHpRo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/Bennykillua/107287dc7a31dda58c6b5a7c0bf6ab88" rel="noopener noreferrer"&gt;https://gist.github.com/Bennykillua/107287dc7a31dda58c6b5a7c0bf6ab88&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Our trigger is a chat.&lt;/li&gt;
&lt;li&gt;The agent is configured as a highly enthusiastic “Deal Hunter” AI. Its system prompt ensures it only responds when the user requests a deal, maintaining an energetic and competitive tone. This keeps the agent focused on just finding and suggesting the best possible product deals.&lt;/li&gt;
&lt;li&gt;For the model, I make use of OpenAI’s GPT-4.1-mini model. This model strikes a balance between cost efficiency and high-quality natural language understanding.&lt;/li&gt;
&lt;li&gt;The memory, I made use of a simple memory buffer that stores the last 10 exchanges. Hence, it remembers what items the user is interested in during the session and avoids repeating questions unnecessarily.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bright Data Verified Node
&lt;/h3&gt;

&lt;p&gt;The node (brightDataTool), which I used as a tool for my AI agent, is set to filter a marketplace dataset. It dynamically receives parameters from the AI agent (Dataset, Field_Name, Field_Value). These parameters are auto-generated based on the user’s request (e.g., “laptop under $500” → dataset = electronics, field = price, value = 500).&lt;/p&gt;

&lt;p&gt;The node returns a filtered snapshot of matching deals from Bright Data’s real-time datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey: Process, Challenges, and Learnings
&lt;/h2&gt;

&lt;p&gt;I started learning about n8n just 10 days ago, though I have heard of the tool. I learned through YouTube tutorials, driven by my desire to complete this task. My background is in data analysis and business process automation, utilizing Microsoft Power Platform, which has provided me with a strong foundation. However, working with an AI-powered agent in n8n was a very new experience for me, and to be honest, it feels quite different compared to the more structured workflows in Power Platform.&lt;/p&gt;

&lt;p&gt;Exploring n8n has been exciting because it combines low-code workflow automation with AI-driven logic and third-party data integrations, making it very powerful and fun to build with. I’m still learning the tool, but I already see how flexible it is for creating intelligent automations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;p&gt;Since this was my first deep dive into AI agents, I had to adapt to how they handle prompts, memory, and external tool usage, which was a learning curve. There are features I would have liked to implement but couldn't cause of the deadline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending emails automatically after finding deals.&lt;/li&gt;
&lt;li&gt;Returning richer data through the Bright Data node (more descriptive results and structured insights).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These were limited by both the tight deadline and my current skill level with n8n.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Learned
&lt;/h3&gt;

&lt;p&gt;Building with n8n is very approachable even for someone coming from a Power Platform background. AI agents introduce a new layer of flexibility and intelligence that traditional automation tools lack. Lastly, the Bright Data node integration demonstrated to me how external data can enrich AI workflows, bridging the gap between automation and actionable, real-world insights.&lt;/p&gt;

&lt;p&gt;To be honest, this has been a great first step into &lt;strong&gt;AI-driven automation with n8n&lt;/strong&gt;, and I’m looking forward to building more advanced workflows. The community has also been pretty helpful.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>n8nbrightdatachallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Learn how to create a Coze plugins from Scratch</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Fri, 25 Oct 2024 22:02:17 +0000</pubDate>
      <link>https://dev.to/bennykillua/learn-how-to-create-a-coze-plugins-from-scratch-6hl</link>
      <guid>https://dev.to/bennykillua/learn-how-to-create-a-coze-plugins-from-scratch-6hl</guid>
      <description>&lt;p&gt;This tutorial will teach you how to create a plugin from scratch in Coze.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://hackernoon.com/how-to-create-plugins-from-scratch-in-coze-coingecko" rel="noopener noreferrer"&gt;https://hackernoon.com/how-to-create-plugins-from-scratch-in-coze-coingecko&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>My Year in Review: Hey there!</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Sat, 31 Dec 2022 07:53:02 +0000</pubDate>
      <link>https://dev.to/bennykillua/my-year-in-review-hey-there-1kfa</link>
      <guid>https://dev.to/bennykillua/my-year-in-review-hey-there-1kfa</guid>
      <description>&lt;p&gt;Honestly, I wasn't planning on writing a year in review. This is my first time writing one, and I am also trying to figure out how to write one. But 2022 was interesting, to say the least. I got into tech in 2021, and 2022 was me exploring and finding my feet within the industry. I also contributed to various open-source projects, made new friends, and experienced fantastic career opportunities.&lt;/p&gt;

&lt;p&gt;I will try to make this personal, but then again, I'm not expressive, so I'll just list some highlights. So here we go in no particular order.&lt;/p&gt;

&lt;h2&gt;
  
  
  2022 highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I finally got the hang of the data analysis landscape and started crushing it at &lt;a href="https://urbizedge.com/"&gt;UrBizEdge&lt;/a&gt;. I learned a couple of new tools and more about old tools I frequently used. I also hit the one-year milestone. Thanks, Michael Olafusi.&lt;/li&gt;
&lt;li&gt;Teaching people about data tools and Microsoft technologies; taught over 400 people.&lt;/li&gt;
&lt;li&gt;I got accepted as a technical writer into more publications, though I did not write for some. On the bright side, I, however, got to write for a bunch of new B2B, B2C, and SaaS organizations like Linux foundation, Bird eats bugs, Loggly, Opslevel, Microsoft 365 blog, and a lot more via &lt;a href="https://www.hitsubscribe.com/"&gt;HitSubscribe&lt;/a&gt;. What made this notable was how broad the topics always were.&lt;/li&gt;
&lt;li&gt;More about technical writing: I also got &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6976486760985821185/"&gt;accepted&lt;/a&gt; into &lt;a href="https://www.freecodecamp.org/news/author/benny/"&gt;freeCodeCamp&lt;/a&gt;, was able to write a post, and made the &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7012756113225854976/"&gt;top contributor&lt;/a&gt; list.&lt;/li&gt;
&lt;li&gt;I got the contract technical role with &lt;a href="https://sematext.com/"&gt;Sematext&lt;/a&gt; four months ago to create &lt;a href="https://sematext.com/glossary/"&gt;glossaries&lt;/a&gt; about various DevOps and cloud terminologies. It is a pretty exciting project because, besides writing, the team and I also work on the information architecture and showcase helpful product demos to help everyone get started.&lt;/li&gt;
&lt;li&gt;I got some amazing feedback from the various &lt;a href="https://www.youtube.com/@MichaelOlafusi/search?query=ifeanyi"&gt;short tutorial videos&lt;/a&gt; I recorded about data analysis, data science, and several data technologies, languages, and tools like Microsoft Excel, SQL, Python, Power BI, Power Query, and the Power Platform.&lt;/li&gt;
&lt;li&gt;In 2022, Hashnode did an &lt;a href="https://townhall.hashnode.com/oss-grant-badge-winners"&gt;Open source themed writeathon&lt;/a&gt;. I learned about open source and gave it a go this year. I got the chance to contribute &lt;a href="http://doctoolchain.org/docToolchain/v2.0.x/"&gt;docToolChain&lt;/a&gt;, a doc-as-code generation tool (here is a &lt;a href="http://doctoolchain.org/tutorials/01_Tutorials/010_Quickstart.html"&gt;quickstart guide&lt;/a&gt;), &lt;a href="https://github.com/numpy"&gt;Numpy&lt;/a&gt;, and a few smaller projects like &lt;a href="https://github.com/oppia"&gt;Oppia&lt;/a&gt; (free education for all) and &lt;a href="https://github.com/andrew-codes/forecast-work"&gt;Forecast work&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For more small wins in open source, the Spotify team added an article I wrote about &lt;a href="https://www.section.io/engineering-education/data-viz-chartify/"&gt;Spotify's Chartify&lt;/a&gt; as an &lt;a href="https://github.com/spotify/chartify/pull/137"&gt;official resource&lt;/a&gt;. I was also able to make a tiny doc fix to Microsoft Power BI's documentation. This is a tool I use a lot, so saying this felt awesome would be an understatement.&lt;/li&gt;
&lt;li&gt;Participated in Hackoberfest 2022 and wrote an article via &lt;a href="https://opensource.com/article/22/10/how-to-contribute-hacktoberfest?sc_cid=7016000000127ECAAY"&gt;opensource.com &lt;/a&gt; to onboard curious folks. 🙈 I also got a &lt;a href="https://tree-nation.com/profile/benny-ifeanyi-iheagwara"&gt;tree planted in my name&lt;/a&gt;. Thanks Hacktoberfest and DigitalOcean!&lt;/li&gt;
&lt;li&gt;My friends &lt;a href="https://github.com/Bennykillua/Getting-started-in-Technical-Writing/blob/main/Empower%20Her%20X%20Non%20Tech%20in%20Tech.md"&gt;(Blessing, Timonwa, and Light)&lt;/a&gt; and I Introduced more than 70 girls to technical writing and open source by mentoring at the Empower Her X Non-Tech in Tech Bootcamp. The conversations, questions, and feedback were also promising and intriguing. I love teaching as well, so this was fun and fulfilling. A few got gigs from the articles they wrote during the Bootcamp, and others made their first open-source contributions.&lt;/li&gt;
&lt;li&gt;Created a &lt;a href="https://github.com/Bennykillua/Getting-started-in-Technical-Writing#readme"&gt;technical writing resource&lt;/a&gt; repository with a friend, &lt;a href="https://www.linkedin.com/in/anyebe-blessing-ene-kwennb/"&gt;Blessing&lt;/a&gt; of CSS tricks. The &lt;a href="https://github.com/Bennykillua/Getting-started-in-Technical-Writing#learning-resource"&gt;repository resources&lt;/a&gt; and &lt;a href="https://github.com/Bennykillua/Getting-started-in-Technical-Writing/discussions"&gt;discussions&lt;/a&gt; are supposed to act as a roadmap for anyone looking to get started in technical writing. Since it is open source, you can contribute to it.&lt;/li&gt;
&lt;li&gt;I attended a few tech events like &lt;a href="https://datafestafrica.com/"&gt;DataFestAfrica&lt;/a&gt; and &lt;a href="https://festival.oscafrica.org/"&gt;OSCAFEST22&lt;/a&gt; (the first physical tech event I have attended and volunteered at).&lt;/li&gt;
&lt;li&gt;Besides data analysis and technical writing, I spoke at, co-organized, and managed meetups that hosted free virtual learning sessions every Sunday. Attendees learned more about &lt;a href="https://www.meetup.com/microsoft-excel-and-data-analysis-learning-community/"&gt;data analysis, Microsoft Excel&lt;/a&gt;, &lt;a href="https://www.meetup.com/power-bi-learning-community/"&gt;Power Platform technologies&lt;/a&gt;, Microsoft Azure, Power BI, SQL, and &lt;a href="https://www.meetup.com/financial-modeling-valuation-learning-community/"&gt;financial modeling&lt;/a&gt; in the community sessions. I co-organized 114 meetup sessions with 70 speakers and the speaker's lineup this year was also impressive. We had Ruth Pozuelo, Bob Umlas, David Abu, Travis Oliphant (the creator of Numpy and SciPy), and many more. Can I include myself as one of the impressive speakers this year?&lt;/li&gt;
&lt;li&gt;For community growth! Each meetup community I managed (&lt;a href="https://www.meetup.com/microsoft-excel-and-data-analysis-learning-community/"&gt;Microsoft Excel and Data Analysis Learning Community&lt;/a&gt;, &lt;a href="https://www.meetup.com/power-bi-learning-community/"&gt;Power BI Learning Community&lt;/a&gt;, and &lt;a href="https://www.meetup.com/financial-modeling-valuation-learning-community/"&gt;Financial Modeling &amp;amp; Valuation Learning Community&lt;/a&gt;) also grew in the number of members and engagements by over 51%.&lt;/li&gt;
&lt;li&gt;Talking about meetups, conferences, and advocacy, I got invited to speak at a couple of meetups like Microsoft Power BI UK, Microsoft Student Ambassadors Kenya, and Resagratia data digest. Oh! And the most significant speaking conference opportunity this year was being a speaker at &lt;a href="https://www.writethedocs.org/conf/prague/2022/"&gt;Write the Docs Prague 2022&lt;/a&gt;. The experience was great! From the past speaker's lineup, we (&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6963831541537869824/"&gt;Mustapha and I&lt;/a&gt;) were also the first speakers ever from Nigeria. Here is a &lt;a href="https://www.writethedocs.org/conf/prague/2022/news/thank-you-recap/"&gt;quick recap of the conference&lt;/a&gt;, our &lt;a href="https://docs.google.com/presentation/d/1WE-8PFfDlEYMywA_Yl5ia54gleVuVXSR5WaUgQCVOKw/edit#slide=id.p"&gt;slide&lt;/a&gt;, &lt;a href="https://www.flickr.com/photos/writethedocs/52378456393/in/album-72177720302317531/"&gt;sketch-note&lt;/a&gt;, and the &lt;a href="https://www.youtube.com/watch?v=w2L3QoTnYbE"&gt;video session&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Self-confidence and social anxiety. I battled a lot with this, and although I have gotten better at it, there is still a lot to be done.&lt;/li&gt;
&lt;li&gt;The biggest win of 2022 is that I am still here, got the chance to meet a couple of my mutuals, and made new friends. GRATEFUL is putting it lightly 🤲🏿 🤲🏿&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These years also had a lot of downs. From the rejections emails, a couple of which pretty hurt ‘cause I was in the 2nd, 3rd, or 4th interview stage, to the period I struggled with low productivity and the letdowns. But, generally, this year's vibe was rough and more of “getting the hang”. Next year will have a more upward trajectory.&lt;/p&gt;

&lt;h2&gt;
  
  
  For 2023…
&lt;/h2&gt;

&lt;p&gt;I'd like to breathe and do better in a lot of things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get better at my career and work.&lt;/li&gt;
&lt;li&gt;Be a lot more visible career-wise.&lt;/li&gt;
&lt;li&gt;Do a physical talk and speak at more conferences. Most of my talks last year have been mostly online.&lt;/li&gt;
&lt;li&gt;Connect more and be a lot more intentional.&lt;/li&gt;
&lt;li&gt;More consistent with my daily 1-hour activity.&lt;/li&gt;
&lt;li&gt;Take a trip… or more.&lt;/li&gt;
&lt;li&gt;More community work.&lt;/li&gt;
&lt;li&gt;Most importantly, have a better personal relationship with God.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to everyone who has been a part of my 2022 journey. Thanks for your support and guidance. I wish you a merry Christmas and a happy new year. Have a blessed 2023, everyone!&lt;/p&gt;

&lt;p&gt;Cover image is by &lt;a href="https://twitter.com/gerard_nartey?s=11&amp;amp;t=C8fNRqBdxc4_oDXNBq24tA"&gt;PhotoGerard&lt;/a&gt;&lt;/p&gt;

</description>
      <category>review</category>
      <category>2022</category>
    </item>
    <item>
      <title>Object-oriented Programming in Python 🐍</title>
      <dc:creator>Benny</dc:creator>
      <pubDate>Tue, 06 Apr 2021 12:33:23 +0000</pubDate>
      <link>https://dev.to/bennykillua/object-oriented-programming-in-python-4gfm</link>
      <guid>https://dev.to/bennykillua/object-oriented-programming-in-python-4gfm</guid>
      <description>&lt;p&gt;Object-oriented Programming (OOP) is a computer programming model that helps one organizes their software design around data, class, and object rather than functions and logic.&lt;br&gt;
Just like you have Knowledge and can perform various methods, Objects have data and can perform various methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Class&lt;/strong&gt; is the blueprint used to create a user-defined data structure. It holds the common attribute and behaviors of the object. For example, the class “Ride” will hold objects “car”, “plane” and “bike”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Object&lt;/strong&gt; is an instance of a class. It has both a property (variables) and behavior (methods). The python object “Car” will have properties; “make”, “model”, “four_wheels” and behaviors; “start”, “stop”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method&lt;/strong&gt; is the behavioral factor of the object. Modifying a method in the class “Ride” would affect all instances of it; “car”, “plane”, and “bike”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instance&lt;/strong&gt; is simply any object made from the class. An instance of the “Ride” class would contain real unique data. A class is like a form while an instance is a filled variation of that form.&lt;/p&gt;

&lt;p&gt;It is good practice to identify all the objects you want to manipulate and how they relate among themselves. This is data modeling.&lt;/p&gt;
&lt;h2&gt;
  
  
  Principles of OOP
&lt;/h2&gt;
&lt;h4&gt;
  
  
  1. Encapsulation
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;State, variables, and methods should be private unless they are being declared public.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An object “car” of a class “Ride” can manage itself via methods “start” and other class “House” cannot touch it expect&lt;br&gt;
allowed to. We can only use the methods to communicate with our object. If we want another class “House” to change the state of the “car” object, we have to create public methods “over_ride_and_start” to modifies or invoke the start&lt;br&gt;
variable. This connection is encapsulation.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Abstraction
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Hide all implementation of the class from anything outside the class.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Our object should hide details and only expose relevant information to another object. Thus public method should be created so object can be called. The “Al voice recognition” may start our “car” object (in the “Ride” class) and open the “Lights” object (in the “Home” class) without having access to the details of our car. This makes maintenance of&lt;br&gt;
an extremely large database less daunting and lowers the chances of bugs.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Inheritance
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Child class should have a mechanism that enables it to inherit behavior and properties from the parent class.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Reusability is the advantage here. Child class “car”, “boat” objects should acquire properties (“has_an_engine”, “can_be_used_for_transport”) from the parent class “Ride”. However, they should have their own unique properties.&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Polymorphism
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Interfacing with objects and receive different forms or results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This allows us to implement a class exactly as intended for the parent class. This prevents errors in types and each&lt;br&gt;
sub-class keeps its own methods. Our class “Ride” has a speed method. Our child class; “Object”, “boat” and “plane” can utilize this method. However, they would each have their own iteration of the speed method.&lt;/p&gt;
&lt;h2&gt;
  
  
  OOP in Python 🐍
&lt;/h2&gt;

&lt;p&gt;Let's Begin! 🚀&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href="https://github.com/Bennykillua/Project/blob/main/Object-oriented%20Programming%20in%20Python%20%F0%9F%90%8D/OOP.py"&gt;Link&lt;/a&gt; to the notebook on my Github. You could download it and follow along.&lt;/p&gt;

&lt;p&gt;Class is defined with the class keyword followed by the name of the class.&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="c1"&gt;#This is also where subsequent code will eventually go.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pass acts as a place holder and thus prevents python from returning an error. At the moment, our car class is without attributes or methods. Let's instantiate our object class by calling the class.&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="n"&gt;car&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every instance of our class is stored in a new memory address. which means every instance of the Car class represents two different objects. Wanna try?&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="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our class has a docstring attribute called &lt;strong&gt;&lt;strong&gt;doc&lt;/strong&gt;&lt;/strong&gt; which holds the documentation of the object.&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;#this is the docstring and it gives a brief about the class
&lt;/span&gt;    &lt;span class="s"&gt;""" A four-wheeled road vehicle that is powered by an engine car has four wheels"""&lt;/span&gt;

&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__doc__&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s make our class interesting by giving it attributes. There are two types; Class attributes and Instance attributes.&lt;br&gt;
                                                                                                                                                                                                 Every attribute in our class would be defined in a method called &lt;strong&gt;.&lt;strong&gt;init&lt;/strong&gt;()&lt;/strong&gt; with self as the first parameter. These are called instance attributes. However, class attributes are attributes that have the same value for all instances of that class. Hence it would be assigned outside the &lt;strong&gt;.&lt;strong&gt;init&lt;/strong&gt;()&lt;/strong&gt; method. All instances of car class (model and colour) are four-wheeled.&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;#Class attributes
&lt;/span&gt;    &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"four"&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s give our instance attributes parameters values. 🧨&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="n"&gt;Toyota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Toyota"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"yellow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;kia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Kia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"black"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Ford&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Honda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Honda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"brown"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have four Car instances with each having unique values. Let’s access the data in these attributes.&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="c1"&gt;#instance attributes
&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#class attributes
&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like I mentioned all instances in a class have &lt;strong&gt;.wheels&lt;/strong&gt;, &lt;strong&gt;.model&lt;/strong&gt; and &lt;strong&gt;.colour&lt;/strong&gt;. However, the values of the instances attributes (&lt;strong&gt;.model&lt;/strong&gt; and &lt;strong&gt;colour&lt;/strong&gt;) would differ; encapsulation and polymorphism. We can also update and modify the values in our instance without changing the values.&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="c1"&gt;#modifying our attributes
&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"red"&lt;/span&gt; &lt;span class="c1"&gt;#previously yellow
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt; &lt;span class="c1"&gt;#previously four
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked!! 😎 So objects are mutable. &lt;/p&gt;

&lt;p&gt;Let’s look at instance methods. Just like .&lt;strong&gt;init&lt;/strong&gt;(), the first parameter is also always self and is defined in our class. Let’s create two instance methods; speed and details.&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"four"&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;

    &lt;span class="c1"&gt;# Instance method
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;details&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"this &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Another instance method
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"This &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at top speed"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's apply these new methods.&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="n"&gt;Toyota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Toyota"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"yellow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;#Toyota.speed(280)
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s look at inheritance. Let’s say we want to add a new class “engine”. We can’t always specific the engine for each car. Let’s create a child class for it&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hybrid_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let’s instantiate these engines for the cars.&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="n"&gt;Toyota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Toyota"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"yellow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;kia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"black"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Honda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Honda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"brown"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Ford&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Hybrid_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s try some basic functions.&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="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;isinstance&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;#Toyota, Kia, Honda and Ford are all instance of Car 
#but Ford wouldn’t be in the Hypdrid engine child class instance.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thus, all objects created from the child class is an instance of the parent (car) but might not be in the same child class (Gas_engine and Hybrid_engine). Let’s give it the parent’s functionality specific to it (Inheritance)&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hybrid_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"210"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; Speed; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;Ford&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Hybrid_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A change in the parent class wouldn’t affect the child class.&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"four"&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colour&lt;/span&gt;

    &lt;span class="c1"&gt;# Instance method
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;details&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"this &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colour&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Another instance method
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"This &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at top speed"&lt;/span&gt;

&lt;span class="n"&gt;Toyota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gas_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Toyota"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"yellow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Toyota&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;367&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;#however ford wouldn’t get the change since we define his child class
&lt;/span&gt;
&lt;span class="n"&gt;Ford&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Hybrid_engine&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;467&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, if we didn’t want this to happen. We would need to use the &lt;strong&gt;.super&lt;/strong&gt; built-in function for the child class. 🙃&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hybrid_engine&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"210"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Ford&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Hybrid_engine&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ford"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary 🎉
&lt;/h2&gt;

&lt;p&gt;In this article, we discussed Object-oriented Programming and the principles which govern it. &lt;/p&gt;

&lt;p&gt;Then we looked at how to define a class, how to instantiate an object from a class, and giving this class some sought of documentation using &lt;strong&gt;.&lt;strong&gt;doc&lt;/strong&gt;&lt;/strong&gt;. Let's not forget we looked at an instance and class attributes and defining properties and behaviors of an object. We also discussed some function such as &lt;strong&gt;type()&lt;/strong&gt;, &lt;strong&gt;isinstance()&lt;/strong&gt; and &lt;strong&gt;super()&lt;/strong&gt;. 🚀&lt;/p&gt;

&lt;p&gt;I hope you found this &lt;a href="https://github.com/Bennykillua/Project/blob/main/Object-oriented%20Programming%20in%20Python%20%F0%9F%90%8D/OOP.py"&gt;notebook&lt;/a&gt; helpful. Remember to share on your favorite social media so other folks can find it, too. Thanks  👍&lt;/p&gt;

</description>
      <category>python</category>
      <category>oop</category>
      <category>codenewbie</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
