<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Achraf Daabek on Medium]]></title>
        <description><![CDATA[Stories by Achraf Daabek on Medium]]></description>
        <link>https://medium.com/@achraf.daabek?source=rss-0014b6277bea------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*sP0UQqhmORlOc9WMg_fjUA@2x.jpeg</url>
            <title>Stories by Achraf Daabek on Medium</title>
            <link>https://medium.com/@achraf.daabek?source=rss-0014b6277bea------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 03:17:39 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@achraf.daabek/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Setting Sail with Databricks: A Beginner’s Voyage Through the Titanic Dataset]]></title>
            <link>https://medium.com/@achraf.daabek/setting-sail-with-databricks-a-beginners-voyage-through-the-titanic-dataset-db2c74b75d89?source=rss-0014b6277bea------2</link>
            <guid isPermaLink="false">https://medium.com/p/db2c74b75d89</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[pyspark]]></category>
            <category><![CDATA[databricks]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Achraf Daabek]]></dc:creator>
            <pubDate>Thu, 16 Jan 2025 17:36:44 GMT</pubDate>
            <atom:updated>2025-01-16T17:36:44.503Z</atom:updated>
            <content:encoded><![CDATA[<p>Ever wanted to captain a data ship? Let’s chart a course through <a href="https://community.cloud.databricks.com/">Databricks Community Edition</a> using the famous Titanic dataset from <a href="https://www.kaggle.com/c/titanic/data">kaggel</a>. Grab a life vest this beginner-friendly guide will help you explore data, visualize results, and get comfortable with basic Spark transformations. Anchors aweigh!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xZe6aHqMSHYXnWel8a7n-g.png" /></figure><p><strong>Ship Ahoy: Sign Up for Databricks Community Edition:</strong></p><p><strong>Set Sail with a Free Account</strong></p><ul><li>Navigate to <a href="https://databricks.com/try-databricks">Databricks Community Edition</a>.</li><li>Sign up with your email (it’s free, so no hidden treasure required).</li><li>Verify your email to launch your shiny new Databricks workspace.</li></ul><p><strong>All Aboard the Workspace</strong></p><ul><li>After logging in, you’ll see the Databricks Home. Congratulations — you’re the proud captain of your own data cruise!</li></ul><p><strong>Hoist the Clusters: Creating Your Spark Engine:</strong></p><p><strong>Head to Compute</strong></p><ul><li>Click on <strong>“Compute”</strong> (or <strong>“Clusters”</strong>) in the left-hand navigation bar.</li></ul><p><strong>Raise a Cluster</strong></p><ul><li>Click <strong>“Create Cluster”</strong>. Give it a memorable name, like S.S. TitanicCluster.</li><li>Accept default settings. (Your cluster’s crew is all set to sail with Spark behind the scenes.)</li></ul><p><strong>Shove Off!</strong></p><ul><li>Click <strong>“Create”</strong> and wait a minute for your cluster to be ready. You’ll see a green icon when the cluster is powered up.</li></ul><p>Charting the Course: Bringing in the Titanic Data:</p><p><strong>Notebook Creation</strong></p><ul><li>In the left panel, click <strong>“Workspace”</strong>, then <strong>“Create”</strong> → <strong>“Notebook”</strong>.</li><li>Give it a name, like Titanic_Analysis (in case you need a reminder of the watery expedition).</li><li>Choose Python as your language.</li></ul><p><strong>Attach Your Cluster</strong></p><ul><li>At the top of the notebook, select your cluster from the dropdown.</li><li>This ensures all your code sails smoothly on the cluster’s Spark engine.</li></ul><p><strong>Download the Titanic CSV</strong></p><ul><li>In a new cell, paste:</li></ul><pre>%sh<br>wget https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv -O /tmp/titanic.csv</pre><ul><li>This uses a shell command (%sh) to fetch the Titanic CSV and place it in a temporary local folder.</li></ul><p><strong>Move Titanic Onto DBFS</strong></p><ul><li>In another cell:</li></ul><pre>dbutils.fs.cp(&quot;file:/tmp/titanic.csv&quot;, &quot;dbfs:/tmp/titanic.csv&quot;)</pre><ul><li>Now we have the data inside <strong>DBFS</strong> (Databricks File System).</li></ul><p><strong>Read the Data</strong></p><ul><li>Let’s load the CSV as a Spark DataFrame:</li></ul><pre>df = spark.read.format(&quot;csv&quot;) \<br>    .option(&quot;header&quot;, &quot;true&quot;) \<br>    .option(&quot;inferSchema&quot;, &quot;true&quot;) \<br>    .load(&quot;dbfs:/tmp/titanic.csv&quot;)<br><br>df.createOrReplaceTempView(&quot;titanic&quot;)<br>df.printSchema()</pre><ul><li>df is your data-laden vessel, and &quot;titanic&quot; is a temporary view to run SQL queries against it.</li></ul><p>Navigating the Data: Exploring the Titanic:</p><p>Peek at the Deck:</p><pre>display(df.limit(5))</pre><ul><li>Shows you the first few passengers (hop on, hop off).</li></ul><p>Head Count:</p><pre>df.count()</pre><ul><li>See how many total passengers (rows) are on this data voyage.</li></ul><p>Peek at the Deck:</p><pre>display(df.limit(5))</pre><ul><li>Shows you the first few passengers (hop on, hop off).</li></ul><p>Data Stats:</p><pre>df.describe().show()</pre><ul><li>Get basic statistics on numerical columns, like min, max, and average Age.</li></ul><p>Null Watch:</p><pre>from pyspark.sql.functions import col, sum as spark_sum<br>display(df.select([spark_sum(col(c).isNull().cast(&quot;int&quot;)).alias(c) for c in df.columns]))</pre><ul><li>Check how many missing values lurk in each column (hopefully no “iceberg” column is missing!).</li></ul><p>Lifeboat Drills: Simple Data Cleaning</p><p>Plug Missing Ages:</p><pre># Calculate average age<br>avg_age = df.selectExpr(&quot;avg(Age)&quot;).collect()[0][0]<br># Fill null &#39;Age&#39; values with average<br>df_filled = df.na.fill({&quot;Age&quot;: avg_age})</pre><p>Divide into Age Groups:</p><pre>from pyspark.sql.functions import when<br>df_transformed = df_filled.withColumn(<br>    &quot;AgeGroup&quot;,<br>    when(df_filled[&quot;Age&quot;] &lt; 18, &quot;Child&quot;).otherwise(&quot;Adult&quot;)<br>)</pre><ul><li>Now you know who’s a “Child” or an “Adult” for further analysis.</li></ul><p>Bon Voyage: Visualize with a Simple Query:</p><p>Count Survivors by Gender:</p><pre>display(spark.sql(&quot;SELECT Sex, Survived, COUNT(*) AS Count FROM titanic GROUP BY Sex, Survived&quot;))</pre><ul><li>A table of how many people survived (Survived=1) vs. didn’t (Survived=0), split by gender (Sex).</li></ul><p>Transform into a Chart:</p><ul><li>In the result panel, click the <strong>Chart</strong> button.</li><li>Choose <strong>Bar</strong> (or try <strong>Pie</strong> if you’re feeling fancy).</li><li>This visual reveals the difference in survival rates by gender, giving you a quick snapshot of the data’s story.</li></ul><p>Disembark and Explore More!</p><p>Congratulations, Captain! You’ve successfully:</p><ul><li>Spun up a <strong>free</strong> Databricks workspace.</li><li>Loaded the <strong>Titanic dataset</strong> into a Spark DataFrame.</li><li>Explored, cleaned, and visualized data using both <strong>Python</strong> and <strong>SQL</strong> in a Databricks notebook.</li></ul><p><strong>Next Steps:</strong></p><ul><li>Tinker with additional <strong>Spark</strong> transformations (like grouping by Pclass to see survival based on ticket class).</li><li>Experiment with <strong>SQL</strong> queries.</li><li>Try more <strong>visualizations</strong> (e.g., a histogram of Age distribution or a stacked bar chart of AgeGroup vs. Survived).</li><li>Dive deeper into advanced analytics or even <strong>machine learning</strong> using the same environment.</li></ul><p>Thanks for cruising on this Titanic data journey! You’ve learned the fundamentals of Databricks keep exploring, and soon you’ll be the master of your own data ocean. Bon voyage!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=db2c74b75d89" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dagster Microservices: Decoupling Infrastructure from User Code for Streamlined Deployments]]></title>
            <link>https://medium.com/@achraf.daabek/dagster-microservices-decoupling-infrastructure-from-user-code-for-streamlined-deployments-1c3819b75470?source=rss-0014b6277bea------2</link>
            <guid isPermaLink="false">https://medium.com/p/1c3819b75470</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[dagster]]></category>
            <dc:creator><![CDATA[Achraf Daabek]]></dc:creator>
            <pubDate>Sat, 14 Dec 2024 16:51:11 GMT</pubDate>
            <atom:updated>2024-12-14T16:51:11.680Z</atom:updated>
            <content:encoded><![CDATA[<h3>Dagster Microservices: Decoupling Infrastructure from User Code for Streamlined Deployments.</h3><p><strong>Dagster</strong> is a powerful data orchestration platform that allows you to build, run, and monitor your data pipelines. In many initial setups, developers combine both the core Dagster infrastructure and the user code (data pipelines, jobs, ops) in one repository and deploy them together. This approach can be convenient at first, but it often becomes unwieldy as your codebase grows. Every small change to your pipeline code might require redeploying the entire Dagster stack, including its infrastructure services.</p><p>A cleaner and more scalable approach is to <strong>separate the Dagster infrastructure from the user code</strong>. By running the Dagster webserver, daemon, and database as a persistent infrastructure, and deploying your user code as a separate gRPC server container, you can update your pipelines independently and without downtime.</p><h3>Benefits of Separation</h3><ul><li><strong>Faster Iteration</strong>: Update your user code repository (use-case repo) and deploy changes without redeploying the entire Dagster stack.</li><li><strong>Stability</strong>: Keep the Dagster infrastructure stable and running at all times.</li><li><strong>Flexibility</strong>: Add or swap out multiple user code repositories with minimal fuss.</li></ul><h3>Prerequisites</h3><ul><li>A Linux VM or server environment (e.g., Ubuntu) with Docker and Docker Compose installed.</li><li>SSH access to the VM.</li><li>Two separate Git repositories:</li></ul><ol><li><strong>Dagster Infra Repository</strong>: Contains only the Dagster infrastructure configuration (webserver, daemon, database, and workspace.yaml).</li><li><strong>User Code Repository</strong>: Contains your actual pipeline code (repo.py) and related dependencies.</li></ol><h3>High-Level Architecture</h3><p><strong>Infra Repo</strong>:</p><ul><li>Runs dagster-webserver</li><li>Runs dagster-daemon</li><li>Runs a Postgres database</li><li>Has a workspace.yaml file pointing to a gRPC server endpoint (which the user code repo provides)</li></ul><p><strong>User Code Repo</strong>:</p><ul><li>Contains your pipeline definitions in repo.py</li><li>Builds an image that launches a Dagster gRPC server serving your code</li><li>Deployed independently and connected to the same Docker network as the infra</li></ul><h3>Step-by-Step Tutorial</h3><h3>1. Set Up the Dagster Infrastructure Repo</h3><p>In your <strong>infra repository</strong> (e.g., dagster-infra):</p><p><strong>Directory Structure:</strong></p><pre>dagster-infra/<br>  ├─ docker-compose-infra.yml<br>  ├─ Dockerfile.dagster<br>  ├─ dagster.yaml<br>  ├─ workspace.yaml<br>  └─ README.md</pre><p><strong>Dockerfile.dagster</strong>:</p><pre>FROM python:3.10-slim<br><br># Install Dagster and related libraries<br>RUN pip install dagster dagster-graphql dagster-webserver dagster-postgres dagster-docker<br><br>ENV DAGSTER_HOME=/opt/dagster/dagster_home<br>RUN mkdir -p $DAGSTER_HOME<br><br># Copy Dagster config files<br>COPY dagster.yaml workspace.yaml $DAGSTER_HOME<br><br>WORKDIR $DAGSTER_HOME</pre><p><strong>docker-compose-infra.yml</strong>:</p><pre>version: &quot;3.8&quot;<br><br>services:<br>  dagster_infra_postgresql:<br>    image: postgres:11<br>    container_name: dagster_infra_postgresql<br>    environment:<br>      POSTGRES_USER: &quot;postgres_user&quot;<br>      POSTGRES_PASSWORD: &quot;postgres_password&quot;<br>      POSTGRES_DB: &quot;postgres_db&quot;<br>    networks:<br>      - dagster_infra_network<br>    healthcheck:<br>      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U postgres_user -d postgres_db&quot;]<br>      interval: 10s<br>      timeout: 8s<br>      retries: 5<br><br>  dagster_infra_webserver:<br>    image: dagster_infra_dagster_image<br>    container_name: dagster_infra_webserver<br>    entrypoint:<br>      - dagster-webserver<br>      - -h<br>      - &quot;0.0.0.0&quot;<br>      - -p<br>      - &quot;3000&quot;<br>      - -w<br>      - &quot;/opt/dagster/dagster_home/workspace.yaml&quot;<br>    expose:<br>      - &quot;3000&quot;<br>    ports:<br>      - &quot;3000:3000&quot;<br>    environment:<br>      DAGSTER_POSTGRES_USER: &quot;postgres_user&quot;<br>      DAGSTER_POSTGRES_PASSWORD: &quot;postgres_password&quot;<br>      DAGSTER_POSTGRES_DB: &quot;postgres_db&quot;<br>    volumes:<br>      - /var/run/docker.sock:/var/run/docker.sock<br>      - /tmp/io_manager_storage:/tmp/io_manager_storage<br>    networks:<br>      - dagster_infra_network<br>    depends_on:<br>      dagster_infra_postgresql:<br>        condition: service_healthy<br><br>  dagster_infra_daemon:<br>    image: dagster_infra_dagster_image<br>    container_name: dagster_infra_daemon<br>    entrypoint:<br>      - dagster-daemon<br>      - run<br>    restart: on-failure<br>    environment:<br>      DAGSTER_POSTGRES_USER: &quot;postgres_user&quot;<br>      DAGSTER_POSTGRES_PASSWORD: &quot;postgres_password&quot;<br>      DAGSTER_POSTGRES_DB: &quot;postgres_db&quot;<br>    volumes:<br>      - /var/run/docker.sock:/var/run/docker.sock<br>      - /tmp/io_manager_storage:/tmp/io_manager_storage<br>    networks:<br>      - dagster_infra_network<br>    depends_on:<br>      dagster_infra_postgresql:<br>        condition: service_healthy<br><br>networks:<br>  dagster_infra_network:<br>    driver: bridge<br>    name: dagster_infra_network</pre><p><strong>dagster.yaml</strong>:</p><pre>run_storage:<br>  module: dagster_postgres.run_storage<br>  config:<br>    postgres_db: &quot;postgres_db&quot;<br>    postgres_user: &quot;postgres_user&quot;<br>    postgres_password: &quot;postgres_password&quot;<br>    hostname: &quot;dagster_infra_postgresql&quot;<br>    port: 5432<br><br>event_log_storage:<br>  module: dagster_postgres.event_log<br>  config:<br>    postgres_db: &quot;postgres_db&quot;<br>    postgres_user: &quot;postgres_user&quot;<br>    postgres_password: &quot;postgres_password&quot;<br>    hostname: &quot;dagster_infra_postgresql&quot;<br>    port: 5432<br><br>scheduler:<br>  module: dagster_postgres.scheduler<br>  config:<br>    postgres_db: &quot;postgres_db&quot;<br>    postgres_user: &quot;postgres_user&quot;<br>    postgres_password: &quot;postgres_password&quot;<br>    hostname: &quot;dagster_infra_postgresql&quot;<br>    port: 5432<br><br>run_coordinator:<br>  module: dagster.core.run_coordinator<br>  class: QueuedRunCoordinator</pre><p><strong>workspace.yaml</strong>:</p><pre>load_from:<br>  - grpc_server:<br>      host: &quot;example_services&quot;  # This will be the user code container name<br>      port: 4000</pre><h3>2. Build and Run the Infra</h3><p>From the dagster-infra directory, run:</p><pre>docker build -f Dockerfile.dagster -t dagster_infra_dagster_image .<br>docker compose -f docker-compose-infra.yml up -d</pre><p>This starts:</p><ul><li>Postgres database</li><li>Dagster webserver on port 3000</li><li>Dagster daemon</li></ul><p>At this point, your Dagster UI should be accessible at http://&lt;YOUR_VM_IP&gt;:3000 or if local machine http://localhost:3000.</p><h3>3. Set Up the User Code Repository</h3><p>In a <strong>separate repository</strong> (e.g., example-use-case):</p><p><strong>Directory Structure:</strong></p><pre>example-use-case/<br>  ├─ Dockerfile.use_case<br>  ├─ repo.py<br>  └─ README.md</pre><p><strong>repo.py</strong> (an example assets pipeline):</p><pre>from dagster import (<br>    asset,<br>    Definitions,<br>    DailyPartitionsDefinition,<br>    get_dagster_logger,<br>    define_asset_job,<br>    ScheduleDefinition,<br>)<br><br># Define a daily partition<br>daily_partitions = DailyPartitionsDefinition(start_date=&quot;2023-01-01&quot;)<br><br># Define the first asset with logging and partitioning<br>@asset(partitions_def=daily_partitions,description=&quot;This is the first asset&quot;)<br>def first_asset(context):<br>    logger = get_dagster_logger()<br>    logger.info(&quot;Running first_asset as test asset&quot;)<br>    <br>    # This asset produces some data<br>    data = {&quot;key&quot;: &quot;value&quot;}<br>    logger.info(f&quot;Produced data: {data}&quot;)<br>    return data<br><br># Define the second asset with logging and partitioning<br>@asset(partitions_def=daily_partitions,description=&quot;This is the second asset&quot;)<br>def second_asset(context, first_asset):<br>    logger = get_dagster_logger()<br>    logger.info(&quot;Running second_asset  from second deployment&quot;)<br>    <br>    # This asset takes the output of the first asset as input<br>    processed_data = {k: v.upper() for k, v in first_asset.items()}<br>    logger.info(f&quot;Processed data: {processed_data}&quot;)<br>    return processed_data<br><br># Define a job that will materialize the assets<br>daily_job = define_asset_job(&quot;daily_job&quot;, selection=[first_asset, second_asset])<br><br># Define a schedule to run the job every day at 10 AM<br>daily_schedule = ScheduleDefinition(<br>    job=daily_job,<br>    cron_schedule=&quot;0 10 * * *&quot;,  # every day at 10 AM<br>)<br><br># Define the repository with the assets, job, and schedule<br>defs = Definitions(<br>    assets=[first_asset, second_asset],<br>    schedules=[daily_schedule],<br>)</pre><p><strong>Dockerfile.use_case</strong>:</p><pre>FROM python:3.10-slim<br><br>RUN pip install dagster dagster-postgres dagster-docker<br><br>WORKDIR /opt/dagster/app<br>COPY repo.py /opt/dagster/app<br><br>EXPOSE 4000<br><br>CMD [&quot;dagster&quot;, &quot;api&quot;, &quot;grpc&quot;, &quot;-h&quot;, &quot;0.0.0.0&quot;, &quot;-p&quot;, &quot;4000&quot;, &quot;-f&quot;, &quot;repo.py&quot;]</pre><h3>4. Deploying the User Code Container</h3><p>Build and run the user code container, making sure it joins the same network as the infra:</p><pre>docker build -f Dockerfile.use_case -t example_services_image .</pre><p>Now, run it in the same network as the infra stack:</p><pre>docker run -d --name example_services --network dagster_infra_network -p 4000:4000 example_services_image</pre><h3>5. Verify Your Setup</h3><p>Open your Dagster UI at http://&lt;YOUR_VM_IP&gt;:3000 or local. You should see your code location and your two assets available, sourced from the gRPC server running in the example_services container.</p><p>Whenever you update repo.py in your example-use-case repo:</p><ol><li>Rebuild the example_services_image.</li><li>Stop the old container and run a new one:</li></ol><pre>docker stop example_services<br>docker rm example_services<br>docker run -d --name example_services --network dagster_infra_network -p 4000:4000 example_services_image</pre><p>Your Dagster infra stays running, and your updated pipelines are immediately available.</p><h3>6. Automating with CI/CD (Optional)</h3><p>You can further automate this process with CI/CD pipelines. For example:</p><ul><li><strong>Infra Repo Pipeline</strong>: Runs occasionally or on infra changes, builds the infra image, and docker compose up the stack.</li><li><strong>User Code Repo Pipeline</strong>: On every push to main, builds the example_services_image and redeploys only that container.</li></ul><p>This setup ensures you have a stable infrastructure and can push new pipeline code to production quickly.</p><h3>Conclusion</h3><p>By separating your Dagster infrastructure from your user code, you gain the flexibility to iterate on your pipelines without constantly redeploying the entire stack. This separation leads to a more maintainable, scalable, and resilient data platform architecture.</p><p>Congratulations! You now have a cleaner and more efficient Dagster deployment strategy.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1c3819b75470" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Navigating the World of Data Engineering as an Expat Freelancer: Key Lessons Learned]]></title>
            <link>https://medium.com/@achraf.daabek/navigating-the-world-of-data-engineering-as-an-expat-freelancer-key-lessons-learned-2179c7107706?source=rss-0014b6277bea------2</link>
            <guid isPermaLink="false">https://medium.com/p/2179c7107706</guid>
            <category><![CDATA[work-life-balance]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[work]]></category>
            <category><![CDATA[freelancing]]></category>
            <category><![CDATA[data]]></category>
            <dc:creator><![CDATA[Achraf Daabek]]></dc:creator>
            <pubDate>Mon, 02 Dec 2024 17:31:34 GMT</pubDate>
            <atom:updated>2024-12-02T17:31:34.179Z</atom:updated>
            <content:encoded><![CDATA[<p>After several years working as a data engineer across different companies in a foreign country, I’ve had the unique opportunity to experience the challenges and rewards of being an expat freelancer. Collaborating with diverse teams and personalities has taught me invaluable lessons about succeeding in this ever-evolving field. I’d like to share some essential guidelines that have helped me navigate this journey.</p><h3>1. Value Your Time and Invest in Yourself</h3><p><strong>Work for What You’re Paid For:</strong> It’s easy to overextend yourself, especially when you’re passionate about your work. However, it’s crucial to align your efforts with your compensation. This doesn’t mean doing the bare minimum, but rather setting healthy boundaries to ensure you’re not undervaluing your contributions.</p><p><strong>Invest in Continuous Learning:</strong> Use your extra time to learn new technologies and skills. The data technology landscape is rapidly evolving, and staying updated is key to remaining competitive. Whether it’s mastering a new programming language or exploring emerging data processing frameworks, continuous learning will open doors to future opportunities.</p><h3>2. Maintain Professional Boundaries</h3><p><strong>Leave Personal Problems at Home:</strong> Bringing personal issues into the workplace can blur professional boundaries and potentially impact your relationships with colleagues. It’s important to compartmentalize and focus on your work while you’re at the office or collaborating on projects.</p><p><strong>Be Cautious with Personal Information:</strong> Sharing too much about your personal life can sometimes backfire. While building camaraderie is important, oversharing can lead to misunderstandings or be used against you in professional settings. Keep conversations professional and steer clear of divulging sensitive information.</p><h3>3. Stay Professional in Challenging Situations</h3><p><strong>Handle Difficult Personalities with Grace:</strong> In a global work environment, you may encounter individuals with different values or even face discrimination. It’s essential to remain professional, not take negative behavior personally, and focus on your objectives. Protect your energy and don’t let others’ actions derail your progress.</p><p><strong>Focus on Your Mission:</strong> Remember why you’re there. Keeping your goals at the forefront will help you navigate difficult interactions and stay motivated, even when faced with adversity.</p><h3>4. Keep Compensation Details Confidential</h3><p><strong>Don’t Discuss Your Salary:</strong> Sharing salary information with colleagues can lead to tension and jealousy within the team. To maintain a harmonious work environment, it’s best to keep compensation details private.</p><h3>5. Be Discreet About Career Moves</h3><p><strong>Keep Future Plans to Yourself:</strong> If you’re considering a new project or a job change, it’s wise to keep those plans confidential until they’re finalized. Prematurely sharing this information can create uncertainty about your commitment and may affect your current engagements.</p><h3>6. Learn to Say No</h3><p><strong>Set Boundaries with Requests:</strong> As a freelancer or consultant, you might feel obligated to agree to every request to please clients or colleagues. However, overcommitting can lead to burnout and decreased quality of work. It’s important to assess your capacity and be comfortable declining requests that exceed your limits.</p><p>Navigating the professional world as an expat data engineer comes with its unique set of challenges, but by adhering to these guidelines, you can enhance your career while maintaining personal well-being. Remember that your journey is as much about professional growth as it is about personal development. Stay focused, keep learning, and protect your energy — these principles will serve you well in any endeavor.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2179c7107706" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Evolution of Data Engineering: Navigating the Modern Data Landscape]]></title>
            <link>https://medium.com/@achraf.daabek/the-evolution-of-data-engineering-navigating-the-modern-data-landscape-d80eddcfa503?source=rss-0014b6277bea------2</link>
            <guid isPermaLink="false">https://medium.com/p/d80eddcfa503</guid>
            <category><![CDATA[data-engineer]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[data-engineering]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Achraf Daabek]]></dc:creator>
            <pubDate>Sun, 24 Nov 2024 13:29:21 GMT</pubDate>
            <atom:updated>2024-11-24T13:29:21.393Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>Hey everyone,</strong></p><p>I wanted to share some thoughts on the incredible data engineering journey. If you’re anything like me, you’ve probably witnessed firsthand how rapidly this field is evolving. It’s both exhilarating and, let’s be honest, a bit overwhelming at times. So, let’s dive into what’s been happening in our world and how we can ride this wave together.</p><p><strong>From Pipelines to Partnerships: The Expanding Role of Data Engineers</strong></p><p>When I first stepped into data engineering, it was all about building pipelines and managing databases. Fast forward to today, and our roles have blossomed into so much more:</p><ul><li><strong>Bridging Data Gaps:</strong> We’re the ones who bring together data from all corners of the organization, painting a complete picture that everyone can use.</li><li><strong>Guardians of Quality:</strong> Ensuring data is accurate and reliable isn’t just a task — it’s a responsibility we hold dearly.</li><li><strong>Scaling Mountains of Data:</strong> With data growing at lightning speed, designing systems that can keep up has become a thrilling challenge.</li><li><strong>Team Collaborators:</strong> We’re no longer working in silos. Partnering with data scientists, analysts, and business teams has become the norm, and it’s making our work more impactful than ever.</li></ul><p><strong>The Challenges We Face (And How We’re Tackling Them)</strong></p><ol><li><strong>Drowning in Data?</strong></li></ol><p>Let’s face it — the sheer amount of data can be intimidating. Structured, unstructured, you name it. But with flexible architectures and innovative processing techniques, we’re turning this challenge into an opportunity.</p><p><strong>2. The Need for Speed</strong></p><p>Real-time data processing isn’t just a buzzword; it’s a necessity. Embracing new tools and methodologies helps us keep latency low and efficiency high.</p><p><strong>3. Keeping Data Safe</strong></p><p>With privacy regulations tightening, data security is front and center. We’re all learning to weave compliance into everything we do, ensuring that the data we handle is protected.</p><p><strong>4. Managing Complex Ecosystems</strong></p><p>Juggling multiple platforms and tools can feel like a circus act. But by focusing on compatibility and seamless integration, we’re making the impossible possible.</p><p><strong>What’s Next? Trends to Watch</strong></p><ul><li><strong>Heading to the Cloud (and Beyond)</strong></li></ul><p>More organizations are moving to cloud-based solutions, and hybrid models are becoming popular to balance control with flexibility. It’s opening up new avenues for scalability and cost savings.</p><ul><li><strong>Automation Nation with DataOps</strong></li></ul><p>By applying DevOps principles to data, we’re streamlining our workflows. Automation isn’t about replacing us; it’s about freeing us to focus on the creative and complex parts of our jobs.</p><ul><li><strong>AI and Machine Learning are Here</strong></li></ul><p>Incorporating AI into our pipelines isn’t just for the tech giants. It’s becoming accessible, allowing us to unlock insights we never thought possible.</p><ul><li><strong>Going Serverless</strong></li></ul><p>Serverless architectures mean less time worrying about infrastructure and more time innovating.</p><p><strong>Tips from My Journey</strong></p><ul><li><strong>Never Stop Learning</strong></li></ul><p>The tech world doesn’t stand still, and neither should we. Whether it’s diving into Apache Spark or exploring a new programming language, continuous learning keeps us at the top of our game.</p><ul><li><strong>Quality Over Quantity</strong></li></ul><p>Taking the time to ensure our data is clean and accurate pays off in the long run. It’s not the most glamorous part of the job, but it’s foundational.</p><ul><li><strong>Teamwork Makes the Dream Work</strong></li></ul><p>Collaborating with others has been one of the most rewarding aspects of my career. Different perspectives lead to better solutions — it’s as simple as that.</p><ul><li><strong>Think Ahead</strong></li></ul><p>Designing with scalability in mind saves headaches down the road. Trust me on this one!</p><p><strong>Wrapping Up</strong></p><p>Being a data engineer today is about so much more than code and infrastructure. It’s about being adaptable, collaborative, and always ready to learn something new. The landscape is shifting, but that just means there are more opportunities to innovate and make a real impact.</p><p>Just to be honest, this article was written by me and corrected by IA .</p><p><em>Thanks for reading! If you enjoyed this article, please share it with others who might find it helpful. Let’s keep the conversation going in the comments below!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d80eddcfa503" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>