<?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: Zephico Technologies</title>
    <description>The latest articles on DEV Community by Zephico Technologies (@zephico).</description>
    <link>https://dev.to/zephico</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4029027%2F534e6458-b5b1-498a-8e07-42f5db7432e2.png</url>
      <title>DEV Community: Zephico Technologies</title>
      <link>https://dev.to/zephico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zephico"/>
    <language>en</language>
    <item>
      <title>Contract engineer vs. full-time hire: the real cost math</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Wed, 12 Aug 2026 20:15:19 +0000</pubDate>
      <link>https://dev.to/zephico/contract-engineer-vs-full-time-hire-the-real-cost-math-4pdm</link>
      <guid>https://dev.to/zephico/contract-engineer-vs-full-time-hire-the-real-cost-math-4pdm</guid>
      <description>&lt;p&gt;When teams compare a contractor's monthly rate against a salary, the salary usually looks cheaper. That comparison is wrong on both sides, and since we &lt;a href="https://zephico.com/services/engineers-on-contract" rel="noopener noreferrer"&gt;place engineers on contract&lt;/a&gt; for a living, it's worth showing the honest version of the math — including the cases where hiring full-time is the right call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a full-time senior engineer actually costs
&lt;/h2&gt;

&lt;p&gt;Take a senior engineer in the US or Western Europe with a headline salary somewhere around $150–200k. The real number is bigger:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Employment overhead.&lt;/strong&gt; Payroll taxes, health insurance, pension contributions, equipment, software seats, office or stipend. Finance teams typically model fully-loaded cost at 1.25–1.4× salary. Your $180k engineer costs the company roughly $230–250k a year before they write a line of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recruiting.&lt;/strong&gt; An agency fee runs 20–25% of first-year salary — $35–45k for one hire. Do it with an internal recruiter and you're paying their salary plus your engineers' interviewing hours, which are real hours that stopped producing software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The vacancy itself.&lt;/strong&gt; Time-to-hire for senior engineers is commonly two to three months, plus notice period. That's a quarter of roadmap that either slips or lands on the rest of the team. Nobody books this to a budget line, which is why it's the most underestimated cost on the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exit.&lt;/strong&gt; If the project ends, priorities shift, or the hire doesn't work out, you're into severance, notice periods and — in much of Europe — a legal process. The option to &lt;em&gt;stop paying&lt;/em&gt; has a price, and full-time employment doesn't include it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a contract engineer actually costs
&lt;/h2&gt;

&lt;p&gt;The monthly rate — and that's mostly it. No recruiting fee, no payroll overhead, no severance exposure. The engineer starts within days rather than months, and when the project ships you scale down without a process.&lt;/p&gt;

&lt;p&gt;There are real costs on this side too, and pretending otherwise would be salesmanship: onboarding time to your codebase, a management relationship to maintain, and knowledge that walks out when the contract ends unless you deliberately capture it. (We wrote about &lt;a href="https://zephico.com/blog/managing-contract-engineers-remote-teams" rel="noopener noreferrer"&gt;running contract engineers well&lt;/a&gt; — most of these costs are controllable.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The break-even question
&lt;/h2&gt;

&lt;p&gt;The comparison isn't "rate vs. salary." It's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Horizon.&lt;/strong&gt; If you're confident the role exists in three years, employment amortizes its fixed costs and wins. If the need is a project, a migration, a spike in roadmap — the fixed costs never amortize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certainty.&lt;/strong&gt; Hiring is a two-to-three-month commitment to a guess about your future roadmap. Contracting converts that guess into a monthly decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge type.&lt;/strong&gt; Core product architecture compounds in a long-tenured employee's head. Skills like "build the Databricks pipeline" or "stand up the Retool console" are transferable — you're buying the capability, not the tenure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where we tell people to hire instead
&lt;/h2&gt;

&lt;p&gt;If the work is your core product and the horizon is years, hire. A staff engineer who has lived in your codebase for four years is worth more than any rotation of outsiders, and no honest staffing company should claim otherwise. Contract engineers win at the edges: projects with an end date, skills you need now but not forever, and teams that need senior capacity this month, not next quarter.&lt;/p&gt;

&lt;p&gt;Run the fully-loaded numbers for your own case before deciding. If the contract column wins, &lt;a href="https://zephico.com/services/engineers-on-contract" rel="noopener noreferrer"&gt;this is what our version looks like&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/contract-engineer-vs-full-time-hire-cost" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>career</category>
    </item>
    <item>
      <title>Medallion architecture on Databricks: what actually matters</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Wed, 12 Aug 2026 20:14:58 +0000</pubDate>
      <link>https://dev.to/zephico/medallion-architecture-on-databricks-what-actually-matters-2nom</link>
      <guid>https://dev.to/zephico/medallion-architecture-on-databricks-what-actually-matters-2nom</guid>
      <description>&lt;p&gt;Every Databricks pitch deck has the same three-layer diagram: bronze for raw data, silver for cleaned data, gold for business-ready tables. The diagram is fine. The problems start when teams treat it as an architecture instead of what it really is — a naming convention for a set of decisions you still have to make.&lt;/p&gt;

&lt;p&gt;Here's where those decisions actually bite, based on the lakehouse builds we've done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bronze: append-only or you'll regret it
&lt;/h2&gt;

&lt;p&gt;The single most common mistake we see is teams "cleaning up" data on the way into bronze — deduplicating, fixing types, dropping malformed rows. It feels tidy. It's also how you lose the ability to reprocess history when your parsing logic turns out to be wrong.&lt;/p&gt;

&lt;p&gt;Bronze should be an append-only, schema-on-read record of exactly what the source system sent you, with ingestion metadata (&lt;code&gt;_ingested_at&lt;/code&gt;, &lt;code&gt;_source_file&lt;/code&gt;) and nothing else. Storage is cheap. The ability to replay six months of raw events after finding a bug in your silver logic is priceless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Silver: this is where your real data model lives
&lt;/h2&gt;

&lt;p&gt;Silver is not "bronze but cleaner." It's where you commit to a data model: one row per entity, resolved keys, enforced schemas, quarantined bad records. Two rules that have served us well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every silver table gets expectations.&lt;/strong&gt; Delta Live Tables' &lt;code&gt;expect_or_drop&lt;/code&gt; (or plain constraint checks in a batch job) with quarantine tables for the failures. A silver table without declared expectations is a bronze table with a misleading name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silver models the domain, not the report.&lt;/strong&gt; If a table exists because one dashboard needs it, it belongs in gold. Silver tables should survive a BI-tool migration untouched.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gold: let it be boring and duplicated
&lt;/h2&gt;

&lt;p&gt;Gold tables can be denormalized, redundant, and aggressively shaped for one consumer. That's the point. Resist the urge to build one "canonical" gold layer that serves every team — you'll end up with a committee-designed table that serves nobody and takes four teams to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parts the diagram doesn't show
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unity Catalog from day one.&lt;/strong&gt; &lt;a href="https://zephico.com/blog/unity-catalog-migration-what-it-takes" rel="noopener noreferrer"&gt;Retrofitting governance onto a running lakehouse is weeks of migration work&lt;/a&gt;; starting with it is an afternoon of setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost visibility before cost optimization.&lt;/strong&gt; Tag jobs by pipeline and team first. Most "Databricks is expensive" complaints turn out to be one forgotten streaming cluster or an oversized all-purpose cluster someone uses for ad-hoc SQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A reprocessing story.&lt;/strong&gt; Decide &lt;em&gt;before&lt;/em&gt; launch how you'll rebuild silver from bronze — full replays, partition-scoped replays, or versioned logic. If the answer is "we'd figure it out," you don't have a lakehouse, you have a pile of Parquet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. That's the real lesson: medallion architectures fail on discipline, not on technology. Get the boring parts right and the diagram takes care of itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/medallion-architecture-databricks-practical-guide" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>databricks</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Agentic AI and big data: what your platform needs before agents are useful</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Sun, 09 Aug 2026 22:25:16 +0000</pubDate>
      <link>https://dev.to/zephico/agentic-ai-and-big-data-what-your-platform-needs-before-agents-are-useful-4i01</link>
      <guid>https://dev.to/zephico/agentic-ai-and-big-data-what-your-platform-needs-before-agents-are-useful-4i01</guid>
      <description>&lt;p&gt;The pitch for agentic AI on enterprise data is genuinely appealing: instead of a chatbot that answers one question at a time, you get something that plans, queries, checks its own work, calls a second tool, and comes back with a finished piece of analysis — or actually does the thing. Reconcile these two systems. Find out why yesterday's pipeline was late and open a ticket. Pull the accounts at churn risk and draft the outreach list.&lt;/p&gt;

&lt;p&gt;The demos work. What determines whether the same thing survives contact with your actual data estate has very little to do with which model you picked, and almost everything to do with what's underneath it. Here's the honest list.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "agentic" actually changes
&lt;/h2&gt;

&lt;p&gt;A single-shot LLM feature — summarize this, answer that — fails visibly. It returns something wrong, a human reads it, and the human moves on. An agent fails differently: it takes a wrong step early, then builds four more steps on top of it, and the output is a confident, internally consistent artifact that's wrong in a way nobody can see without redoing the work.&lt;/p&gt;

&lt;p&gt;Two properties drive most of the difficulty:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-step means compounding error.&lt;/strong&gt; If each step in a chain is 90% reliable, a five-step task is roughly 60% reliable end to end. That math is why agents that look brilliant on a rehearsed demo feel flaky on real work — the demo was three steps on clean data, the real task is eight steps on messy data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool use means real consequences.&lt;/strong&gt; The moment an agent can write to a table, open a ticket, send a message, or trigger a job, "the model hallucinated" stops being an annoyance and becomes an incident. Read-only agents and acting agents are different risk products and should be scoped, reviewed and rolled out differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data platform is the bottleneck, not the model
&lt;/h2&gt;

&lt;p&gt;Every agent that touches your data is doing one of two things: retrieving from documents, or querying tables. On the table side — which is where most enterprise value sits — the agent's ceiling is set by your semantic layer, not by model quality.&lt;/p&gt;

&lt;p&gt;If your warehouse has three definitions of "active customer," inconsistent grain between your orders and sessions tables, and columns named &lt;code&gt;flag_2&lt;/code&gt; with no description, an agent will do exactly what a new analyst with no context would do: pick something plausible and be wrong. The difference is that the new analyst asks someone by Wednesday, and the agent never does.&lt;/p&gt;

&lt;p&gt;Concretely, before agents are worth piloting on your data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curated tables, not raw ones.&lt;/strong&gt; Point agents at governed, well-modeled gold tables with documented columns — not at the bronze layer, not at production replicas. Narrow, clean scope is the single highest-leverage thing you control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata that carries meaning.&lt;/strong&gt; Table and column descriptions in a catalog (Unity Catalog, if you're on Databricks) aren't documentation hygiene here — they're the mechanism by which the agent knows what it's looking at.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One definition per metric.&lt;/strong&gt; Agreed definitions for revenue, churn, active user, encoded once as views or metric definitions. If humans argue about it, the agent will simply pick a side and present it as fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Known freshness.&lt;/strong&gt; An agent that doesn't know a table lags by six hours will happily report yesterday's number as today's.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is agent-specific work. It's the same modeling and governance discipline that makes BI trustworthy — the difference is that agents make skipping it expensive faster, because they scale confident wrong answers to more people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools beat raw access
&lt;/h2&gt;

&lt;p&gt;The instinct with a capable model is to hand it broad SQL access and let it figure things out. In practice, the systems that hold up do the opposite: they expose a small number of narrow, well-described, deterministic tools, and let the model decide &lt;em&gt;which&lt;/em&gt; to call rather than &lt;em&gt;how&lt;/em&gt; to compute.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;get_revenue_by_region(start_date, end_date, region?)&lt;/code&gt; is a tool an agent uses correctly almost every time. "Here's a SQL endpoint against 400 tables, good luck" is a tool that works in the demo and produces silent join errors in month two. Every piece of business logic you move out of the model's improvisation and into a tested function is a step you no longer have to evaluate probabilistically.&lt;/p&gt;

&lt;p&gt;The design rules that matter: keep the tool count small enough that selection is unambiguous, make each description precise about what it returns and at what grain, return structured data with explicit units and date ranges, and make errors informative — an agent recovers well from "no rows for that region; valid regions are X, Y, Z" and badly from a stack trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity, permissions and audit
&lt;/h2&gt;

&lt;p&gt;This is where agentic projects most often stall in security review, and the concern is legitimate. If an agent queries data using one service principal with broad access, then every user of that agent effectively inherits that access — your row-level and column-level controls are gone, laundered through a chatbot.&lt;/p&gt;

&lt;p&gt;What a defensible setup looks like: the agent runs queries under the identity of the requesting user, so existing catalog permissions apply unchanged; every tool call is logged with inputs, outputs and requester; write actions are scoped to purpose-built service accounts with the narrowest possible grants; and anything consequential — money moving, records changing, messages leaving the building — either runs through human approval or is confined to a reversible sandbox. Decide which actions require a human &lt;em&gt;before&lt;/em&gt; the pilot, not after the first bad one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost and latency at big-data scale
&lt;/h2&gt;

&lt;p&gt;Agentic patterns multiply everything. One user question can become a dozen model calls and half a dozen queries as the agent explores, checks and retries. On a lakehouse, a careless exploratory query against a multi-terabyte table isn't a rounding error — it's real compute, and it can be triggered in a loop.&lt;/p&gt;

&lt;p&gt;The controls that matter are unglamorous: point agents at pre-aggregated gold tables rather than letting them scan raw history; enforce query limits, row caps and timeouts at the warehouse layer, not in the prompt; cap the number of steps per task; cache aggressively, since agents re-ask the same sub-questions constantly; and route cheap steps to a small model, reserving the expensive one for planning and synthesis. Put a per-task cost budget on the pilot and alert when it's exceeded. You want to learn the shape of that number in week two, not from a quarterly bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  You are evaluating trajectories, not answers
&lt;/h2&gt;

&lt;p&gt;Evaluation for a single-shot feature is a graded set of questions with known-good answers. That doesn't transfer cleanly to agents, because two runs can reach the same correct number by different routes, and one of those routes may be luck.&lt;/p&gt;

&lt;p&gt;So evaluate both: final-answer correctness against a domain expert's spot check, and the trajectory — did it call sensible tools in a sensible order, and did it stop when it should have? Track step count and cost per task alongside accuracy, because the failure mode you're most likely to hit isn't a wrong answer, it's an agent taking fourteen steps to produce a right one at ten times the expected cost. Keep the eval set versioned and rerun it on every prompt or tool change, or you're shipping on vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this pays off first
&lt;/h2&gt;

&lt;p&gt;The best first agentic use cases are internal, reversible, and sit on data you already trust. Data engineering toil is a strong candidate: triaging a failed pipeline by reading logs, checking upstream freshness, and drafting a summary with a suggested cause — a task where the agent gathers context and a human decides. Analyst support is another: multi-step ad hoc questions that today queue behind a person, on a curated domain like support tickets or subscription billing.&lt;/p&gt;

&lt;p&gt;What we'd avoid for a first project: anything customer-facing, anything that writes to a system of record without review, and anything spanning domains where the data model is still contested. Those aren't permanent exclusions — they're just a bad place to learn what your platform can't yet support.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sane sequence
&lt;/h2&gt;

&lt;p&gt;Pick one domain with clean, well-understood tables. Fix the metadata and metric definitions in that domain first — that's usually the real project, and it's worth doing whether or not the agent ships. Build three to five narrow tools instead of granting broad access. Run under user identity with full logging. Set step, row and cost ceilings. Write twenty real tasks with known-good answers and grade both output and trajectory. Then, and only then, widen the scope.&lt;/p&gt;

&lt;p&gt;If your catalog and semantic layer are already in good shape, that's a matter of weeks. If they aren't, the agent pilot quietly becomes a data platform cleanup — which is worth knowing before you commit to a launch date, not after.&lt;/p&gt;

&lt;p&gt;That platform work is most of what makes agentic AI real, and it's what our &lt;a href="https://zephico.com/services/data-analytics-ai" rel="noopener noreferrer"&gt;data engineering and AI team&lt;/a&gt; does for clients on Databricks and AWS — governed tables, tool layers, evaluation harnesses, and the cost controls that keep the whole thing affordable. If you're scoping an agentic project and want a straight read on whether your data is ready for it, &lt;a href="https://zephico.com/contact" rel="noopener noreferrer"&gt;talk to us&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/agentic-ai-big-data-platform-requirements" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>databricks</category>
    </item>
    <item>
      <title>Snowflake to Databricks: what the migration actually costs you</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Tue, 04 Aug 2026 23:55:05 +0000</pubDate>
      <link>https://dev.to/zephico/snowflake-to-databricks-what-the-migration-actually-costs-you-5e09</link>
      <guid>https://dev.to/zephico/snowflake-to-databricks-what-the-migration-actually-costs-you-5e09</guid>
      <description>&lt;p&gt;Most Snowflake-to-Databricks migrations get sold on cost and delivered on something else. The credit line item is what gets the project funded, but the teams that finish happy are usually the ones that moved for a different reason: they wanted ML, streaming and GenAI workloads living next to the analytics data instead of shuttling between two platforms. If your only justification is the bill, read the breakeven section below before you commit — the honest number is longer than the deck says.&lt;/p&gt;

&lt;p&gt;We're a &lt;a href="https://zephico.com/services/data-engineering-databricks" rel="noopener noreferrer"&gt;Databricks shop&lt;/a&gt;, and we've written elsewhere about &lt;a href="https://zephico.com/blog/databricks-vs-snowflake-mid-size-companies" rel="noopener noreferrer"&gt;how to choose between the two platforms&lt;/a&gt; if you haven't committed yet. This post assumes you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changes underneath
&lt;/h2&gt;

&lt;p&gt;The two platforms look similar from a SQL console and are structurally different behind it. The mapping worth internalising before planning anything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Snowflake&lt;/th&gt;
&lt;th&gt;Databricks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Proprietary micro-partitions inside Snowflake&lt;/td&gt;
&lt;td&gt;Delta Lake files in your own S3/ADLS/GCS bucket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;Virtual warehouses, T-shirt sized&lt;/td&gt;
&lt;td&gt;Job clusters, all-purpose clusters, SQL Warehouses, Photon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Role hierarchy, row access policies, masking policies&lt;/td&gt;
&lt;td&gt;Unity Catalog across tables, models, notebooks, dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharing&lt;/td&gt;
&lt;td&gt;Secure Data Sharing&lt;/td&gt;
&lt;td&gt;Delta Sharing (open protocol)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing unit&lt;/td&gt;
&lt;td&gt;Credits&lt;/td&gt;
&lt;td&gt;DBUs, priced differently per compute type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The storage row is the one with the most downstream consequences. On Snowflake, storage and compute are separate line items on the same bill; on Databricks, storage is your cloud provider's problem and your cloud provider's invoice. That's a genuine benefit — the data stays readable by other engines — but it also means your "Databricks cost" and your "data platform cost" stop being the same number, and finance needs to know that before the first invoice arrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick a strategy before you pick a tool
&lt;/h2&gt;

&lt;p&gt;Three patterns, and the choice determines everything after it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lift-and-shift.&lt;/strong&gt; Replicate schemas one-to-one, translate the SQL, cut over. Fastest, and it faithfully preserves every design compromise you made in Snowflake — including the ones you made because Snowflake billed you that way. Defensible when a contract is expiring and the calendar is the constraint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-platform.&lt;/strong&gt; Translate the schema into a &lt;a href="https://zephico.com/blog/medallion-architecture-databricks-practical-guide" rel="noopener noreferrer"&gt;medallion structure&lt;/a&gt;, keep the business logic, redesign the layout. This is where most estates should land: you get Delta's file layout, liquid clustering and Photon working for you rather than inheriting a shape that fought them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-architect.&lt;/strong&gt; Rebuild the pipelines around Databricks-native patterns — streaming ingestion, Delta Live Tables, jobs instead of tasks. Longest timeline, best economics on the far side, and only realistic if the team is being funded for a platform program rather than a migration ticket.&lt;/p&gt;

&lt;p&gt;The mistake is choosing lift-and-shift for speed and then expecting re-architect savings. Snowflake-shaped tables on Databricks compute cost what Snowflake-shaped tables cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The effort lives in the SQL, not the data
&lt;/h2&gt;

&lt;p&gt;Copying the data is a solved problem. Bulk export to Parquet, land it in object storage, &lt;code&gt;CREATE TABLE ... USING DELTA&lt;/code&gt;, validate. For a large estate it's a scheduling exercise, not an engineering one — and Lakehouse Federation lets you query Snowflake in place while you sequence it, which is worth using as a bridge rather than as a destination.&lt;/p&gt;

&lt;p&gt;The code is where the schedule goes. Automated converters — Databricks' own tooling, BladeBridge, the assistant — will get you most of the way through straightforward SQL. What they don't handle is the long tail, and the long tail is disproportionate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript stored procedures&lt;/strong&gt; have no Databricks equivalent. They get rewritten as PySpark or SQL scripting, by hand, by someone who understands what they were doing. If you have dozens of these, that's your critical path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semi-structured handling.&lt;/strong&gt; &lt;code&gt;FLATTEN&lt;/code&gt;, &lt;code&gt;LATERAL FLATTEN&lt;/code&gt;, Snowflake's &lt;code&gt;VARIANT&lt;/code&gt; semantics and its particular null-handling in JSON paths all need deliberate translation. The queries usually run after conversion; they just quietly return different rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timezone and date arithmetic.&lt;/strong&gt; Snowflake and Spark disagree on enough edge cases that anything doing fiscal-calendar or session-window logic needs test coverage, not eyeballing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clustering.&lt;/strong&gt; Snowflake's automatic clustering has no direct equivalent. You choose Z-ordering or liquid clustering deliberately, per table, based on actual query predicates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;dbt projects port more easily than people expect — adapter swap plus incremental strategy tuning — but BI semantic layers do not. Re-pointing a connection is not a migration; the metrics need re-validation against the old platform, number by number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Unity Catalog before you move anything
&lt;/h2&gt;

&lt;p&gt;Snowflake's role model does not map cleanly onto Unity Catalog's &lt;code&gt;catalog.schema.table&lt;/code&gt; hierarchy, and trying to translate it mechanically produces a permission structure nobody can reason about. Do the design first — catalogs, schemas, group ownership, grant boundaries — and migrate into it. We've written up &lt;a href="https://zephico.com/blog/unity-catalog-migration-what-it-takes" rel="noopener noreferrer"&gt;what the migration itself involves&lt;/a&gt; and &lt;a href="https://zephico.com/blog/unity-catalog-governance-playbook" rel="noopener noreferrer"&gt;how to run governance afterwards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Treat this as the one moment you can delete roles. Mature Snowflake estates accumulate roles the way filesystems accumulate temp files, and a migration is the only time you'll have political cover to not recreate them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate in three layers, then run in parallel
&lt;/h2&gt;

&lt;p&gt;Structural checks — row counts, column types, null distributions — catch the copy errors. Semantic checks — aggregates at several grains, not just the total — catch the logic errors. Financial checks mean regulatory and revenue figures matched exactly, because "close enough" on a restated number is a career event for someone in finance.&lt;/p&gt;

&lt;p&gt;Then run both platforms in parallel for your critical workloads, comparing outputs daily, for weeks rather than days. Parallel running is expensive and boring and it is the single control that keeps a migration from becoming an incident. Budget for the double bill explicitly so nobody has to justify it mid-project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The breakeven number, honestly
&lt;/h2&gt;

&lt;p&gt;Migration costs real money: engineering time, parallel running, retraining, and the conversion long tail that always overruns. Against that, savings depend entirely on workload mix. ML and exploratory workloads usually see meaningful reductions. Steady, predictable SQL reporting often lands at rough parity — Databricks compute isn't free, and a SQL Warehouse left running behaves exactly like a Snowflake warehouse left running.&lt;/p&gt;

&lt;p&gt;So model it per workload, not as a platform-level percentage. And model the cleanup: a large fraction of any mature estate is tables and jobs nobody consumes. Finding those in discovery and &lt;em&gt;not&lt;/em&gt; migrating them is frequently a bigger saving than the platform switch itself.&lt;/p&gt;

&lt;p&gt;If you're scoping this, the cheapest useful step is a discovery pass — inventory, dependency map, credit consumption by workload, and an honest count of the stored procedures that will need hand conversion. Zephico is a &lt;a href="https://zephico.com/partners/databricks" rel="noopener noreferrer"&gt;Databricks Consulting Partner&lt;/a&gt;, and our &lt;a href="https://zephico.com/services/data-engineering-databricks" rel="noopener noreferrer"&gt;certified engineers&lt;/a&gt; run that assessment as a fixed-scope engagement before anyone commits to a timeline. &lt;a href="https://zephico.com/contact" rel="noopener noreferrer"&gt;Talk to us&lt;/a&gt; if you'd rather know the number before the project starts than halfway through it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/snowflake-to-databricks-migration" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>databricks</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>When Retool is the right answer (and when it isn't)</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Wed, 29 Jul 2026 00:02:20 +0000</pubDate>
      <link>https://dev.to/zephico/when-retool-is-the-right-answer-and-when-it-isnt-j97</link>
      <guid>https://dev.to/zephico/when-retool-is-the-right-answer-and-when-it-isnt-j97</guid>
      <description>&lt;p&gt;We're Retool-certified and we build internal tools with it for clients — so you'd expect us to say Retool is always the answer. It isn't, and knowing where the line sits is most of the value of working with people who use it daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Retool wins, clearly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ops consoles over existing data.&lt;/strong&gt; Refund workflows, order lookups, inventory corrections, support tooling — anything where the data already lives in PostgreSQL, an API, or a warehouse, and the "app" is really forms, tables and buttons with permissions. A tool your ops team needs would take a product squad six weeks in React; in Retool it's days, and the six weeks were never going to be approved anyway. That's the honest comparison: Retool doesn't usually replace a custom build, it replaces &lt;em&gt;nothing getting built&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approval workflows with audit requirements.&lt;/strong&gt; Role-based access, audit logs, and SSO come with the platform. For teams facing GDPR requests or SOC 2 audits, replacing "shared spreadsheet plus direct database edits" with an audited tool is often the entire business case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools with fewer than a couple hundred internal users.&lt;/strong&gt; Retool's pricing and performance are built for internal scale, not consumer scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we talk clients out of it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Customer-facing anything.&lt;/strong&gt; The moment external users log in, you're fighting the platform on branding, latency, licensing and auth. Build customer-facing surfaces with a real framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heavy client-side logic.&lt;/strong&gt; If your "internal tool" is actually an interactive editor, a scheduling engine, or anything with complex client-side state, the visual builder becomes the bottleneck. You'll write thousands of lines of JavaScript in string fields and wish you had a repo. (Some of it can live in modules and version control now, but the gravity is still wrong.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core business workflows you'll iterate on for years.&lt;/strong&gt; Retool is fast to build and fine to maintain, but a workflow that &lt;em&gt;is&lt;/em&gt; the business — underwriting, dispatch, pricing — eventually deserves the testability, review culture and hiring pool of a conventional codebase. We've migrated tools out of Retool for exactly this reason, and that's fine: it earned its keep for two years first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern that works
&lt;/h2&gt;

&lt;p&gt;Start the workflow in Retool while it's still changing weekly. When it stabilizes and hardens into the business, graduate it to a custom build with the requirements now fully known. The Retool version becomes your working spec — the cheapest, most accurate spec you'll ever write.&lt;/p&gt;

&lt;p&gt;The wrong question is "Retool or real code?" The right one is "how much certainty do we have about this workflow?" Low certainty, move fast in Retool. High certainty and high stakes, invest in code. We're happy building either — which is exactly why you can trust the recommendation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/retool-internal-tools-when-to-use" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>retool</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>How to make contract engineers actually work: lessons from the other side</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Wed, 29 Jul 2026 00:01:59 +0000</pubDate>
      <link>https://dev.to/zephico/how-to-make-contract-engineers-actually-work-lessons-from-the-other-side-1afa</link>
      <guid>https://dev.to/zephico/how-to-make-contract-engineers-actually-work-lessons-from-the-other-side-1afa</guid>
      <description>&lt;p&gt;We place contract engineers into teams across North America and Europe, which means we've watched the same engagement succeed at one company and stall at another — with the same engineer. The difference is almost never the engineer. It's a handful of structural choices the client makes in the first two weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat week one as an investment, not a cost
&lt;/h2&gt;

&lt;p&gt;The engagements that compound all look the same at the start: the contract engineer gets a working dev environment on day one, a real (small) ticket in the first week, and a named person to ask questions of. The ones that stall spend three weeks "getting access sorted" while the engineer bills hours reading a wiki.&lt;/p&gt;

&lt;p&gt;If your security process takes two weeks to provision access, start it &lt;em&gt;before&lt;/em&gt; the start date. This sounds obvious. It is skipped constantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give outcomes, not tickets
&lt;/h2&gt;

&lt;p&gt;A contract engineer who receives pre-chewed tickets performs like a junior no matter how senior they are, because all the judgment was spent by whoever wrote the ticket. The teams that get senior output hand over problems: "our nightly pipeline overruns into business hours — own it." Then the engineer's experience actually gets used, and the interesting decisions surface in review where your team can see the reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timezone offset is a feature if you design for it
&lt;/h2&gt;

&lt;p&gt;With a team in India and a client in New York, there are roughly four hours of overlap and twenty hours of relay. Teams that fight this — insisting on full-day synchronous presence — burn out the engineer and get the worst of both worlds. Teams that design for it get a genuine advantage: work specced in the client's afternoon is running by their next morning.&lt;/p&gt;

&lt;p&gt;The design is simple: overlap hours are for decisions (standups, reviews, pairing on anything ambiguous), non-overlap hours are for execution, and everything decided in a call gets written down because someone will act on it eight hours later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure integration, not utilization
&lt;/h2&gt;

&lt;p&gt;The metric that predicts a successful engagement isn't hours billed — it's how quickly the contractor becomes indistinguishable from the team in your tools. Are they reviewing your engineers' PRs by week three? Are they in the incident channel? Did someone ask &lt;em&gt;them&lt;/em&gt; a question this week? If after a month the contractor is still a ticket-taker on the outside of every discussion, the engagement is failing regardless of what the timesheet says.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say the quiet part in the contract
&lt;/h2&gt;

&lt;p&gt;Notice periods, IP assignment, who owns the laptop, what happens to access on the last day — none of this is awkward if it's written down at the start, and all of it is awkward later if it isn't. A staffing partner who resists clear contract terms is telling you something.&lt;/p&gt;

&lt;p&gt;Most of this list is just "treat contract engineers like engineers." The companies that do get senior output within days of the start date — which is the entire reason they went with contractors instead of a six-month hiring pipeline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/managing-contract-engineers-remote-teams" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>remote</category>
    </item>
    <item>
      <title>Databricks Workflows vs Airflow vs Dagster: Picking an Orchestrator</title>
      <dc:creator>Zephico Technologies</dc:creator>
      <pubDate>Tue, 28 Jul 2026 21:13:07 +0000</pubDate>
      <link>https://dev.to/zephico/databricks-workflows-vs-airflow-vs-dagster-picking-an-orchestrator-4i81</link>
      <guid>https://dev.to/zephico/databricks-workflows-vs-airflow-vs-dagster-picking-an-orchestrator-4i81</guid>
      <description>&lt;p&gt;Every data team eventually asks the same question: what runs our pipelines, on what schedule, with what retry logic, and who gets paged when it fails. The answer used to default to Airflow because there wasn't a real alternative. Now there are three reasonable defaults, and they optimize for different things. Picking wrong doesn't break anything on day one — it shows up eighteen months later as either an operations team drowning in scheduler maintenance or an engineering team fighting a platform that won't do what they need it to.&lt;/p&gt;

&lt;p&gt;Here's the actual tradeoff, not the vendor pitch version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Databricks Workflows: the path of least resistance, if you're all-in on Databricks
&lt;/h2&gt;

&lt;p&gt;Databricks Workflows is the orchestrator built into the platform. Jobs, clusters, Unity Catalog permissions, and Workflows all share the same control plane, which means you're not maintaining a separate scheduler, not managing a second set of credentials, and not debugging why an external system can't see a table that Unity Catalog says it can. Task dependencies, retries, cluster reuse across tasks, and job-level alerting all come for free.&lt;/p&gt;

&lt;p&gt;The cost is exactly what you'd expect from a platform-native tool: it orchestrates Databricks well and everything else poorly. There's no first-class way to trigger a task in your orchestration DAG that waits on a Salesforce export, calls an internal API, or coordinates a dbt run against a warehouse that isn't Databricks SQL. You can bolt these in with webhooks and external scripts, but you're fighting the tool rather than using it. Workflows also doesn't give you the asset-lineage or testing story that Dagster does — it schedules tasks, not data assets.&lt;/p&gt;

&lt;p&gt;If your data platform genuinely is Databricks end to end — ingestion, transformation, ML, serving — Workflows removes an entire category of operational overhead you'd otherwise be paying for nothing. Teams in this position who reach for Airflow anyway usually do it out of habit, not need, and end up running two schedulers where one would do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Airflow: the incumbent, and the bill that comes with it
&lt;/h2&gt;

&lt;p&gt;Airflow's argument is maturity and reach. It has the largest operator ecosystem of any orchestrator, a decade of production hardening, and a hiring pool that already knows it. If your pipelines touch a dozen systems — a couple of warehouses, three SaaS APIs, an on-prem database, a message queue, and Databricks somewhere in the mix — Airflow (or something with equivalent breadth) is close to mandatory, because it's the only one built from the ground up to sit above heterogeneous systems rather than inside one of them.&lt;/p&gt;

&lt;p&gt;What Airflow charges you for that breadth is operational weight. Self-hosted, you're running a scheduler, a metadata database, a web server, and workers, and you own upgrades, DAG-parsing performance as the DAG count grows, and the sharp edges around task isolation. Managed options — MWAA on AWS, Astronomer, Google's Cloud Composer — remove the infrastructure burden but add real cost and still leave you managing DAG deployment and dependency versioning yourself. Airflow's execution model is also fundamentally task-centric: it knows a task ran, not what data it produced or whether that data is fresh, valid, or the same asset another DAG also writes to. Teams that want a data-asset-first mental model layer tools like dbt or add asset-check conventions on top to compensate.&lt;/p&gt;

&lt;p&gt;Airflow 3 narrowed some of these gaps — better task isolation, some asset-aware scheduling — but the operational model is still: you run this, or you pay someone to run it for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dagster: asset-based thinking, at the cost of ecosystem size
&lt;/h2&gt;

&lt;p&gt;Dagster starts from a different premise: instead of orchestrating tasks, you declare the data assets your pipeline produces and the dependencies between them (software-defined assets). The scheduler then figures out the DAG from the asset graph. In practice this means significantly better local development — you can materialize a single asset, mock inputs, and test it in isolation without spinning up the whole pipeline — and lineage that's a natural byproduct of how you define pipelines rather than something you bolt on afterward. For teams that have been burned by Airflow DAGs that pass silently but produce garbage data, Dagster's typed I/O and asset-check model is a meaningful upgrade in confidence.&lt;/p&gt;

&lt;p&gt;The tradeoff is ecosystem size. Dagster's integration library is smaller than Airflow's, the community and hiring pool are both younger, and if you need an obscure operator for a legacy system, you're more likely to be writing it yourself than pulling it off the shelf. Dagster also orchestrates across heterogeneous systems fine — it's not Databricks-specific — but you're trading Airflow's breadth for a better development model, not getting both for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real decision framework
&lt;/h2&gt;

&lt;p&gt;Ignore the marketing angle from each vendor and the decision comes down to two questions: how much of your stack lives outside Databricks, and how much do you value asset-centric thinking and local testability over ecosystem breadth.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-platform-on-Databricks shop, most pipelines are notebooks and Databricks jobs.&lt;/strong&gt; Use Workflows. You'll be maintaining fewer systems and every feature you'd otherwise build (retries, alerting, cluster lifecycle) is already there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrating across many heterogeneous systems&lt;/strong&gt; — multiple warehouses, SaaS APIs, on-prem systems, Databricks as one node among several — Airflow's breadth usually wins, especially if your team already knows it or you're prepared to pay for a managed instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same heterogeneous situation, but you're building new and value strong typing, asset lineage, and a real local dev/test loop&lt;/strong&gt; over ecosystem size — Dagster deserves a serious evaluation, particularly for greenfield platforms where you're not migrating years of existing DAGs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest answer really is "it depends on your existing stack," and any framework that skips that and hands you one universal answer is selling something. The one mistake we see repeatedly is teams running Airflow purely to orchestrate Databricks jobs, paying the full operational cost of a general-purpose scheduler to do a job Workflows does natively — that's worth a hard look before you commit to a migration or a managed Airflow contract.&lt;/p&gt;

&lt;p&gt;If you're mid-evaluation and want a second opinion on which of these fits your actual pipeline mix, our &lt;a href="https://zephico.com/services/data-engineering-databricks" rel="noopener noreferrer"&gt;Databricks data engineering team&lt;/a&gt; has built and migrated orchestration on all three. &lt;a href="https://zephico.com/contact" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt; and we'll walk through your stack with you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://zephico.com/blog/databricks-workflows-vs-airflow-vs-dagster" rel="noopener noreferrer"&gt;Zephico blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>databricks</category>
      <category>airflow</category>
      <category>dataengineering</category>
      <category>orchestration</category>
    </item>
  </channel>
</rss>
