<?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 PJ-Paul Julius on Medium]]></title>
        <description><![CDATA[Stories by PJ-Paul Julius on Medium]]></description>
        <link>https://medium.com/@PJ_PaulJulius?source=rss-aa4b14edc998------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*wBR3UiD3mUKA0B2b0AiH6Q.jpeg</url>
            <title>Stories by PJ-Paul Julius on Medium</title>
            <link>https://medium.com/@PJ_PaulJulius?source=rss-aa4b14edc998------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 01:43:34 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@PJ_PaulJulius/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[Why Every Developer Needs Liquibase in Their Toolkit]]></title>
            <link>https://medium.com/@PJ_PaulJulius/why-every-developer-needs-liquibase-in-their-toolkit-635621b2532e?source=rss-aa4b14edc998------2</link>
            <guid isPermaLink="false">https://medium.com/p/635621b2532e</guid>
            <dc:creator><![CDATA[PJ-Paul Julius]]></dc:creator>
            <pubDate>Tue, 10 Jan 2023 06:10:25 GMT</pubDate>
            <atom:updated>2023-01-10T18:46:51.303Z</atom:updated>
            <content:encoded><![CDATA[<p>Are you tired of the tedious task of managing and deploying database schema changes? Do you hate writing raw SQL and coordinating with your team? Are you sick of spending hours testing and deploying changes to different environments? If you answered yes to any of these questions, it’s time to ditch your old ways and try Liquibase.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/384/1*6N3gLRWCH5g6i9IHMC4ppQ.png" /><figcaption>Liquibase belongs in your developer toolkit!</figcaption></figure><p>Liquibase is a database schema management tool that makes your life as a developer much easier. You can define database schema changes using a clear and easy-to-understand syntax, rather than the often headache-inducing raw SQL. Plus, you can use Liquibase to create, modify, or delete tables, columns, indexes, and other database objects, as well as to modify data or manage referential integrity.</p><p>But the benefits of Liquibase don’t stop there. It also allows you to track the history of your database schema changes and roll back changes if necessary. No more regretting that ill-advised change you made last week! And if you’re working with a team, Liquibase makes it easy to merge changes and avoid stepping on each other’s toes.</p><p>But perhaps the best part of Liquibase is its ability to deploy database schema changes to multiple environments with ease. You can generate SQL scripts or execute changes directly on the database, and use the tool’s command-line interface or its integration with popular build tools and IDEs to automate the process. No more manually deploying changes to each and every environment.</p><p>In short, Liquibase is the ultimate tool for simplifying the tedious task of managing and deploying database schema changes. I’ve been using it on a variety of projects dating as far back as 2008. So why wait? Give it a try and see the magic for yourself.</p><p>Next: Check out my <a href="https://medium.com/@PJ_PaulJulius/tutorial-quick-dirty-liquibase-with-maven-mysql-5fd7fda22021">Quickstart tutorial</a> for getting started with Liquibase on Maven/MySQL projects</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=635621b2532e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tutorial: Quick & Dirty Liquibase with Maven/MySQL]]></title>
            <link>https://medium.com/@PJ_PaulJulius/tutorial-quick-dirty-liquibase-with-maven-mysql-5fd7fda22021?source=rss-aa4b14edc998------2</link>
            <guid isPermaLink="false">https://medium.com/p/5fd7fda22021</guid>
            <dc:creator><![CDATA[PJ-Paul Julius]]></dc:creator>
            <pubDate>Tue, 10 Jan 2023 06:08:43 GMT</pubDate>
            <atom:updated>2023-01-10T18:44:54.117Z</atom:updated>
            <content:encoded><![CDATA[<p>Already using Maven &amp; MySQL? You’re in luck! It only takes five easy steps to use Liquibase on your project. This tutorial covers the minimal steps required to get set up using Liquibase.</p><p>In a <a href="https://medium.com/@PJ_PaulJulius/why-every-developer-needs-liquibase-in-their-toolkit-635621b2532e">previous post</a>, I made the case for why every developer needs Liquibase in their toolkit. This tutorial will demonstrate the ease with which you can adopt Liquibase into your workflow.</p><figure><img alt="A computer of programmers making their lives easier by using Liquibase." src="https://cdn-images-1.medium.com/max/256/1*hlilDo_vwTSRBiS6EIFvMw.png" /></figure><p>Like I’ve done on many projects, I have a local MySQL server running on my development machine. That makes testing easier. You could use this same approach to connect to a MySQL DB anywhere, like AWS or Google Cloud. For this tutorial, I’m keeping it simple to demonstrate how easy adding Liquibase to a project can be.</p><p>This tutorial assumes:</p><ol><li>A <em>pom.xml</em> exists at the root of your &lt;project&gt; directory.</li><li>The &lt;project&gt; uses the typical Maven structure, e.g. production code lives in <em>&lt;project&gt;/src/main/java/…</em> and text resources live in <em>&lt;project&gt;/src/main/resources/…</em></li><li>A <em>username</em> and <em>password</em> exist for the database with the right permissions for creating and dropping tables.</li></ol><p>Now let’s dive in. It’s a simple 5 steps.</p><p><strong>Step 1</strong>. Create a place for Liquibase files</p><p>Make a directory for database stuff and changelogs:</p><pre>mkdir &lt;project&gt;/src/main/resources/db<br>mkdir &lt;project&gt;/src/main/resources/db/changelog</pre><p><strong>Step 2</strong>. Set up your Liquibase properties file</p><p>Liquibase uses a properties file to store information about your database connection and any additional settings you may need. Ours will be simple, only requiring four settings.</p><p>Create a text file named <em>liquibase.properties</em> in the <em>&lt;project&gt;/src/main/resources/db</em> directory. Edit the file to add four lines to specify the <em>changeLogFile</em> location, the database connection URL, and the username and password for the database.</p><pre>changeLogFile: src/main/resources/db/changelog/db.changelog-master.yaml<br>url: jdbc:mysql://localhost:3306/myapp<br>username: my_username<br>password: my_password</pre><p><strong>Step 3</strong>. Create your first change set</p><p>A change set is a group of changes that should be applied to your database as a single unit. Next, let&#39;s specify a change to the database by adding it to the changelog. In the previous step, we said the <em>changeLogFile</em> would be in <em>src/main/resources/db/changelog/db.changelog-master.yaml</em>. We edit that file and add a change to use while testing out Liquibase. Note that we are using the YAML format, which I prefer because it’s terse. Liquibase <a href="https://docs.liquibase.com/concepts/changelogs/changelog-formats.html">supports other formats</a> like XML, JSON, SQL, etc.</p><pre>databaseChangeLog:<br>- changeSet:<br>    id: 1<br>    author: myname<br>    changes:<br>    - createTable:<br>        tableName: person_test<br>        columns:<br>        - column:<br>            autoIncrement: true<br>            constraints: {nullable: false, primaryKey: true}<br>            name: id<br>            type: int<br>        - column:<br>            constraints: {nullable: false}<br>            name: name<br>            type: varchar(255)<br>        - column:<br>            constraints: {nullable: false}<br>            name: email<br>            type: varchar(255)</pre><p><strong>Step 4</strong>. Add Liquibase to Maven</p><p>Now that we have the <em>liquibase.properties</em> file in place and our first change specified, we are ready to update our Maven <em>pom.xml</em> to include Liquibase. Edit the <em>pom.xml</em> to add the <em>liquibase-maven-plugin</em> to the <em>plugins</em> section of your <em>build</em> section.</p><pre>&lt;project&gt;<br>...<br>  &lt;build&gt;<br>    &lt;plugins&gt;<br>      ... <br>      &lt;plugin&gt;<br>        &lt;groupId&gt;org.liquibase&lt;/groupId&gt;<br>        &lt;artifactId&gt;liquibase-maven-plugin&lt;/artifactId&gt;<br>        &lt;configuration&gt;<br>          &lt;propertyFile&gt;src/main/resources/db/liquibase.properties&lt;/propertyFile&gt;<br>        &lt;/configuration&gt;<br>      &lt;/plugin&gt;<br>    &lt;/plugins&gt;<br>  &lt;/build&gt;<br>  ...<br>&lt;/project&gt;</pre><p>And if you don’t already have the <em>mysql-connector-java</em> dependency included in your <em>pom.xml</em>, add it now.</p><pre>&lt;project&gt;<br>  ...<br>  &lt;dependencies&gt;<br>    ...<br>    &lt;dependency&gt;<br>      &lt;groupId&gt;mysql&lt;/groupId&gt;<br>      &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;<br>      &lt;version&gt;8.0.31&lt;/version&gt;<br>    &lt;/dependency&gt;<br>  &lt;/dependencies&gt;<br>  ...<br>&lt;/project&gt;</pre><p><strong>Step 5</strong>. Run Liquibase</p><p>We are ready to run our first Liquibase command with Maven. First, run the <em>liquibase:update</em> command to add the new <em>person_test</em> table to the database.</p><pre>&gt; mvn liquibase:update</pre><p>Then, I like to look at the database. For my satisfaction, I like to make sure that the new table got added. Since I have the MySQL server running locally, I can run a simple command to <em>show</em> the tables and describe the new <em>person_test</em> table.</p><pre>&gt; mysql -u my_username -p myapp -e &quot;show tables; desc person_test;&quot;<br>+-----------------------+<br>| Tables_in_myapp       |<br>+-----------------------+<br>| ...                   |<br>| person_test           |<br>| ...                   |<br>+-----------------------+<br>+-------+--------------+------+-----+---------+----------------+<br>| Field | Type         | Null | Key | Default | Extra          |<br>+-------+--------------+------+-----+---------+----------------+<br>| id    | int          | NO   | PRI | NULL    | auto_increment |<br>| name  | varchar(255) | NO   |     | NULL    |                |<br>| email | varchar(255) | NO   |     | NULL    |                |<br>+-------+--------------+------+-----+---------+----------------+</pre><p>Voila! The new table exists and has the three fields we specified in our changeset. That’s how easy it is to set up and run with Liquibase.</p><p>We don’t want to keep our person_test table, though. That was just for testing. Liquibase makes it easy to roll back changes to the database. Let’s roll back that change.</p><pre>&gt; mvn liquibase:rollback -Dliquibase.rollbackCount=1</pre><p>As you continue to develop your project, you can add additional change sets as needed to track and apply changes to your database. Simply add new change sets to your change log file and run the update command to apply the changes to the database.</p><p>And that’s it! You’re now up and running with Liquibase. With this tool, you’ll be able to easily track and manage changes to your database schema, making your development process more efficient and streamlined. Happy coding!</p><p>Watch a <a href="https://www.loom.com/share/65cc2004cd51425694b9333439e3d13c">video of this tutorial</a> on Loom</p><p>Find out more about <a href="https://docs.liquibase.com/home.html">Liquibase</a></p><p>Find out more about <a href="https://docs.liquibase.com/tools-integrations/maven/home.html">Liquibase with Maven</a></p><p>Find out more about <a href="https://docs.liquibase.com/start/install/tutorials/mysql.html">Liquibase with MySQL</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5fd7fda22021" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Roman Dobrik and I just published an article about how we have been using SnowAlert within…]]></title>
            <link>https://medium.com/@PJ_PaulJulius/roman-dobrik-and-i-just-published-an-article-about-how-we-have-been-using-snowalert-within-5c17d04e8bb?source=rss-aa4b14edc998------2</link>
            <guid isPermaLink="false">https://medium.com/p/5c17d04e8bb</guid>
            <category><![CDATA[slack]]></category>
            <category><![CDATA[snowflake]]></category>
            <category><![CDATA[big-data]]></category>
            <category><![CDATA[snowflake-computing]]></category>
            <category><![CDATA[proactive-support]]></category>
            <dc:creator><![CDATA[PJ-Paul Julius]]></dc:creator>
            <pubDate>Tue, 17 Sep 2019 12:35:46 GMT</pubDate>
            <atom:updated>2019-09-17T23:27:20.609Z</atom:updated>
            <content:encoded><![CDATA[<h3>Making Data Say Something</h3><p><a href="https://medium.com/u/323e6662032b">Roman Dobrik</a> and I just published an article about how we have been using SnowAlert within Customer Support at Snowflake to get proactive. It’s a great evolution.<br>Anyone using Snowflake should probably have a read through. You might get some ideas for taking even better advantage of all that info in your warehouses!</p><p><a href="https://medium.com/@roman.dobrik_70856/pop-data-from-snowalert-to-slack-6356c72c3d81">PoP Data from SnowAlert to Slack</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5c17d04e8bb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[4 Rules for CTO Chit Chats]]></title>
            <link>https://medium.com/@PJ_PaulJulius/4-rules-for-cto-chit-chats-2e4edce5fad8?source=rss-aa4b14edc998------2</link>
            <guid isPermaLink="false">https://medium.com/p/2e4edce5fad8</guid>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[cto]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[meetings]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[PJ-Paul Julius]]></dc:creator>
            <pubDate>Mon, 28 Aug 2017 00:38:29 GMT</pubDate>
            <atom:updated>2017-08-28T00:54:05.249Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>CTO Chit Chats</strong>, named whimsically to describe the <em>fun yet beneficial meetings</em> that I host biweekly, follow <strong>4 simple rules</strong>:</p><ol><li>Nobody <em>has</em> to attend, but we might discuss <strong>serious topics</strong></li><li>Treats for everyone</li><li>End 10 minutes to the hour</li><li>Tell everyone what’s on the CTO’s mind</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*LrAq3j-FKfCdhNygXmWfrA.png" /></figure><h3>[OPTIONAL] Meeting</h3><p>Every two weeks, I host a special meeting. I invite everyone in my organization to an “optional” roundtable discussion. As many as 40 people, sit in concentric circles at 4 PM ET<em>. </em>We take time to discuss whatever people want to discuss. A recent data warehousing breakthrough provided <strong>ample technical conversation</strong> one week. Hiccups while moving work across teams gave us <strong>process-related debate fodder</strong>.</p><p>Those serious topics all get documented by a diligent scribe named Pati Biel. She sends the notes to all invitees. This recently won Pati a <em>shout out </em>from a thankful team member.</p><h3>Treats Keep Them Talking</h3><p>Treats vary from cookies, to cupcakes, to smoothies. They provide the little nudge some need to go from “I might just skip it…” to “Yeah, I’ll go for a Twinkie.” Given the late afternoon timing, a sugar bump seemed smart.</p><h3>End Early, On Time</h3><p>I keep the conversation moving, and we always end on time — at 10 minutes to the hour (4:50 PM). I push people to adopt techniques to optimize our most precious resource, time. See helpful advice like <a href="https://www.mindtools.com/CommSkll/RunningMeetings.htm">MindTools summary</a> and <a href="https://www.forbes.com/sites/victorlipman/2013/03/01/5-simple-steps-to-more-efficient-effective-meetings">Forbes more formal treatment</a>. Consider this my little nudge to be a <em>good role model</em>!</p><p>End your Chit Chats <strong>10 minutes early</strong>.</p><h3>Hey CTO, What’s on Your Mind?</h3><p>A couple weeks ago, a quiet session led one person to enlighten me. “What we really want to hear is what’s on your mind, PJ!”. I missed the most obvious question. So now, I start with a quick download on those topics plaguing my thoughts.</p><p>During my tenure at <a href="https://www.thoughtworks.com/">ThoughtWorks</a>, <a href="https://www.linkedin.com/in/nsingham/">Roy Singham</a> ran regular get togethers with employees. I loved Roy’s candid chatter about everything going on at the company. <a href="https://www.linkedin.com/in/richardlharris/">Richard Harris</a>, CEO at <a href="http://intentmedia.com/">Intent Media</a>, hosts monthly <strong>Fireside Chats</strong>. Employees write anonymous questions on paper. They slip them into a glass bowl. Richard then answers the questions.</p><p>Following in Roy’s and Richard’s footsteps, I sit open to ad hoc questions. It took some cajoling before I learned to <strong>keep my answers concise</strong>. I find it easy to share my concerns, but I am also <a href="https://www.merriam-webster.com/word-of-the-day/palaver-2014-09-25">palaverous</a>.</p><p>So, keep it short, and to the point, PJ! The end.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2e4edce5fad8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Paint Employees A Bigger Picture]]></title>
            <link>https://medium.com/@PJ_PaulJulius/paint-employees-a-bigger-picture-dc81eea5ef50?source=rss-aa4b14edc998------2</link>
            <guid isPermaLink="false">https://medium.com/p/dc81eea5ef50</guid>
            <category><![CDATA[chief-technology-officer]]></category>
            <category><![CDATA[innovation]]></category>
            <category><![CDATA[employee-engagement]]></category>
            <category><![CDATA[management-and-leadership]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[PJ-Paul Julius]]></dc:creator>
            <pubDate>Thu, 03 Aug 2017 04:15:52 GMT</pubDate>
            <atom:updated>2017-08-03T04:15:52.207Z</atom:updated>
            <content:encoded><![CDATA[<p>Tech company boards keep telling us <a href="http://intentmedia.com/">CTOs</a> the same thing.</p><blockquote>“Keep the employees engaged, motivated, productive, innovative.”</blockquote><p>Every lost employee represents <strong>real cost eating away precious revenue</strong>. Managers often leave their most powerful retention tool holstered — <em>a paintbrush</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*8N3Hvhom8XQV7H6VTuuVbA.jpeg" /><figcaption>Unholster your most powerful retention weapon — a paintbrush.</figcaption></figure><p>Each year, presents me with an opportunity to <em>paint a picture</em> with each employee. I love comp review season!</p><p>Let me share an example from 2017. An engineer expected to hear my corporate contextualization and a salary figure. Instead, I told her the salary update right away, and then segued to:</p><blockquote>“I am so excited that you have been with us for so long. I can tell that you are one of those programmers. A programmer that will shift the way people think about technology interfaces. You challenge the norms. I love that even when the rest of the industry does one thing, you try to cross the boundary. The next 5 years are going to unleash more change in the way we interact with computers than the last 25. If you keep pushing yourself like you do, you can help lead humanity into a brave new world.”</blockquote><p>No mincing words. <strong>No lies</strong>. Not over-inflating her ego. Nothing about me, nor the company, nor meeting professional expectations.</p><p>I tap into my own experience to guess where she might go. I steer her interests toward a big future. I use my knowledge of our industry’s history to paint a big, but realistic future. I always end with a simple question,</p><blockquote>“Do you see that for yourself?”</blockquote><p>I ask that question, even though I know the answer.</p><p>Her response was,</p><blockquote>“I never thought that far ahead. That sounds exciting, but I wouldn’t even know where to start.”</blockquote><p>That instant marks her critical shift. Instead of focusing on a narrow step or two, she sees a distant horizon pictured . This phrase, <em>“…I wouldn’t even know where to start,”</em> opens the door for one of the <strong>greatest honors I have as a manager</strong>. My response,</p><blockquote>“Well, let me help you get started…”</blockquote><p>I get out my paintbrush and <strong>help paint a big, big picture</strong>!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dc81eea5ef50" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>