<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Development Archives - Sully Syed</title>
	<atom:link href="https://yllus.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://yllus.com/category/software-development/</link>
	<description>Management executive, software developer and cyclist hailing from Toronto, Canada.</description>
	<lastBuildDate>Fri, 16 Jan 2026 19:02:41 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>NodeJS / JavaScript: Use NVM and .nvmrc to switch NodeJS versions automatically per project folder on Mac OS X</title>
		<link>https://yllus.com/2025/12/20/nodejs-javascript-use-nvm-and-nvmrc-to-switch-nodejs-versions-automatically-per-project-folder-on-mac-os-x/</link>
					<comments>https://yllus.com/2025/12/20/nodejs-javascript-use-nvm-and-nvmrc-to-switch-nodejs-versions-automatically-per-project-folder-on-mac-os-x/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Sat, 20 Dec 2025 21:35:05 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://yllus.com/?p=3893</guid>

					<description><![CDATA[Your various software development projects are going to require you to use different versions of Node.js to compile and run; to make this process a little bit quicker, you can utilize NVM and .nvmrc files places in your project root <a href="https://yllus.com/2025/12/20/nodejs-javascript-use-nvm-and-nvmrc-to-switch-nodejs-versions-automatically-per-project-folder-on-mac-os-x/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Your various software development projects are going to require you to use different versions of Node.js to compile and run; to make this process a little bit quicker, you can utilize NVM and .nvmrc files places in your project root folders to automatically switch versions when you change into them.</p>
<p>Let&#8217;s start by installing nvm using Brew:</p>
<pre class="brush: plain; title: ; notranslate">
brew install nvm
</pre>
<p>For those of us using Zsh as our Mac OS X shell, append the following to <strong>~/.zshrc</strong> in your user home directory; it handles the automatic version switching per code project folder:</p>
<pre class="brush: plain; title: ; notranslate">
# If a .nvmrc file is present in the folder that we just changed into, switch to the version specified in it.
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version=&quot;$(nvm version)&quot;
  local nvmrc_path=&quot;.nvmrc&quot;

  if &#x5B; -f &quot;$nvmrc_path&quot; ]; then
    local nvmrc_node_version=$(cat &quot;$nvmrc_path&quot;)
    if &#x5B; &quot;$nvmrc_node_version&quot; != &quot;$node_version&quot; ]; then
      nvm use &quot;$nvmrc_node_version&quot;
    fi
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
</pre>
<p>Next, you likely need to install a couple of different versions of Node.js; for example, to find the latest exact version of v18 to install, run:</p>
<pre class="brush: plain; title: ; notranslate">
nvm ls-remote 18
</pre>
<p>Now all we need to do is put a <strong>.nvmrc</strong> file in each project folder to switch to an installed version; if my <strong>~/code/yllus_site/</strong> folder needs version v18.20.8, a file at <strong>~/code/yllus_site/.nvmrc</strong> should simply consist of:</p>
<pre class="brush: plain; title: ; notranslate"> 18.20.8 </pre>
<p>Reference:</p>
<ul>
<li><a href="https://engrmafzaalch.medium.com/automatically-switch-to-correct-version-of-nodejs-based-on-project-2880fbfef44e">Medium: Automatically Switch to Correct Version of NodeJs Based on Project</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2025/12/20/nodejs-javascript-use-nvm-and-nvmrc-to-switch-nodejs-versions-automatically-per-project-folder-on-mac-os-x/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating another MySQL superuser on Amazon Aurora or Amazon RDS</title>
		<link>https://yllus.com/2025/08/15/creating-another-mysql-superuser-on-amazon-aurora-or-amazon-rds/</link>
					<comments>https://yllus.com/2025/08/15/creating-another-mysql-superuser-on-amazon-aurora-or-amazon-rds/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Fri, 15 Aug 2025 18:48:44 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://yllus.com/?p=3868</guid>

					<description><![CDATA[Normally, creating a second (or third, fourth&#8230;) MySQL superuser who has all available database privileges is as simple as executing: GRANT ALL PRIVILEGES ON *.* TO &#039;newuser&#039;@&#039;%&#039; IDENTIFIED BY &#039;password&#039;; However, MySQL database in Amazon RDS and Amazon Aurora only <a href="https://yllus.com/2025/08/15/creating-another-mysql-superuser-on-amazon-aurora-or-amazon-rds/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Normally, creating a second (or third, fourth&#8230;) MySQL superuser who has all available database privileges is as simple as executing:</p>
<pre class="brush: plain; title: ; notranslate">
GRANT ALL PRIVILEGES ON *.* TO &#039;newuser&#039;@&#039;%&#039; IDENTIFIED BY &#039;password&#039;;
</pre>
<p>However, MySQL database in Amazon RDS and Amazon Aurora only allow one superuser to exist; however, you can neatly replicate the effect of having a superuser (the same full set of privileges) by modifying your SQL query to the following:</p>
<pre class="brush: plain; title: ; notranslate">
GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, DELETE, CREATE VIEW, INDEX, EVENT, DROP, TRIGGER, REFERENCES, INSERT, CREATE USER, UPDATE, RELOAD, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT, CREATE TEMPORARY TABLES ON *.* TO &#039;newuser&#039;@&#039;%&#039; WITH GRANT OPTION;
</pre>
<p>References:</p>
<ul>
<li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.MasterAccounts.html">User Guide for Aurora: Master user account privileges</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2025/08/15/creating-another-mysql-superuser-on-amazon-aurora-or-amazon-rds/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Use Amazon S3 and CloudFront to create a proper HTTP and HTTPS redirect for a domain name</title>
		<link>https://yllus.com/2025/02/25/use-amazon-s3-and-cloudfront-to-create-a-proper-http-and-https-redirect-for-a-domain-name/</link>
					<comments>https://yllus.com/2025/02/25/use-amazon-s3-and-cloudfront-to-create-a-proper-http-and-https-redirect-for-a-domain-name/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 14:18:46 +0000</pubDate>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://yllus.com/?p=3820</guid>

					<description><![CDATA[Fairly often we purchase a new domain or decommission an existing one and need to redirect all queries to it to a specific URL on a wholly different domain and website. Practically all services where you can register domain like <a href="https://yllus.com/2025/02/25/use-amazon-s3-and-cloudfront-to-create-a-proper-http-and-https-redirect-for-a-domain-name/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Fairly often we purchase a new domain or decommission an existing one and need to redirect all queries to it to a specific URL on a wholly different domain and website. Practically all services where you can register domain like GoDaddy, name.com and Namecheap <a href="https://www.namecheap.com/support/knowledgebase/article.aspx/385/2237/how-to-set-up-a-url-redirect-for-a-domain/">offer a redirect function</a>, but nearly all fail to work if the user attempts to go to a HTTPS URL on the domain you are redirecting.</p>
<p>If you&#8217;re already making use of Amazon AWS Cloud, a very low cost and foolproof solution is to utilize Amazon S3&#8217;s static website hosting feature along with Amazon CloudFront to handle the redirect:</p>
<ol>
<li><strong>Create a new Amazon S3 bucket</strong> (eg. domain-redirect-olddomaincom) with ACLs disabled, the checkbox to block all public access unchecked (as we wish to allow public access) and bucket versioning disabled; create the bucket.</li>
<li>Edit the newly created S3 bucket; under the Properties tab, edit the <strong>Static Website Hosting</strong> properties.</li>
<li>In the Static Website Hosting properties page:
<ul>
<li><em>Static website hosting:</em> Enable</li>
<li><em>Hosting type:</em> Host a static website</li>
<li><em>Index document:</em> index.html</li>
<li><em>Redirection rules:</em> Copy/paste the following, with the appropriate changes made to the values of HostName and ReplaceKeyPrefixWith:
<pre><code>[
    {
        "Redirect": {
            "HostName": "www.newdomain.com",
            "HttpRedirectCode": "301",
            "Protocol": "https",
            "ReplaceKeyPrefixWith": "path/to/redirect/to/"
        }
    }
]</code></pre>
</li>
</ul>
</li>
<li>Hit the <strong>Save Changes</strong> button to finalize the redirect using the S3 bucket; it should work immediately and allow you to test it via the Bucket Website Endpoint URL shown on the page.</li>
<li>Create a new Amazon CloudFront distribution, making sure to:
<ol>
<li><em>Create Origin:</em> Ensure that it points to the static website endpoint of your new S3 bucket (eg. domain-redirect-olddomaincom.s3-website.ca-central-1.amazonaws.com, not the default of domain-redirect-olddomaincom.s3.ca-central-1.amazonaws.com)</li>
<li><em>Alternate domain name (CNAME):</em> Enter all versions of the domain you wish to be handled and redirected (eg. olddomain.com and www.olddomain.com)</li>
<li><em>Custom SSL certificate:</em> Request a certificate that handles the domains you entered above; this is the (free) option that allows your newly set up domain redirect to respond properly to both HTTP and HTTPS requests</li>
</ol>
</li>
<li>Add the Amazon CloudFront domain (eg. d1gyvh82u10kd6.cloudfront.net) to your domain name&#8217;s DNS records for the root and subdomains you wish to redirect.</li>
</ol>
<p>You&#8217;re done! While a bit long-winded as a process, this appears to be the cheapest and most foolproof way to set up a domain redirect for the long term.</p>
<p><a href="https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect.png" rel='magnific'><img fetchpriority="high" class="aligncenter size-large wp-image-3826" src="https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-1024x895.png" alt="" width="550" height="481" srcset="https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-1024x895.png 1024w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-300x262.png 300w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-150x131.png 150w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-768x672.png 768w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-1536x1343.png 1536w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2025/02/25092931/aws-s3-static-website-hosting-domain-redirect-2048x1791.png 2048w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2025/02/25/use-amazon-s3-and-cloudfront-to-create-a-proper-http-and-https-redirect-for-a-domain-name/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Get your MySQL table sizes in MB via a SQL query</title>
		<link>https://yllus.com/2023/11/27/get-your-mysql-table-sizes-in-mb-via-a-sql-query/</link>
					<comments>https://yllus.com/2023/11/27/get-your-mysql-table-sizes-in-mb-via-a-sql-query/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Mon, 27 Nov 2023 17:48:33 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=3472</guid>

					<description><![CDATA[Figuring out what tables are making your database excessively large can be really helpful when working with production database exports and keeping various environments up to date. This SQL query outputs that information for all databases on a given server: <a href="https://yllus.com/2023/11/27/get-your-mysql-table-sizes-in-mb-via-a-sql-query/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Figuring out what tables are making your database excessively large can be really helpful when working with production database exports and keeping various environments up to date. This SQL query outputs that information for all databases on a given server:</p>
<pre class="brush: plain; title: ; notranslate">
SELECT
	table_schema AS `Database`,
	table_name AS `Table`,
	ROUND(((data_length + index_length) / 1024 / 1024), 2) AS `Size in MB`
FROM information_schema.TABLES
ORDER BY table_schema, (data_length + index_length) DESC;
</pre>
<p>Reference:</p>
<ul>
<li><a href="https://stackoverflow.com/a/9620273">How to get the sizes of the tables of a MySQL database?</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2023/11/27/get-your-mysql-table-sizes-in-mb-via-a-sql-query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Generate MySQL INSERT statements for a few existing records</title>
		<link>https://yllus.com/2023/10/31/generate-mysql-insert-statements-for-a-few-existing-records/</link>
					<comments>https://yllus.com/2023/10/31/generate-mysql-insert-statements-for-a-few-existing-records/#comments</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Tue, 31 Oct 2023 19:23:51 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=3464</guid>

					<description><![CDATA[Occasionally, you&#8217;ll want to duplicate a couple of records from your production MySQL database for local use without dumping the entire table (which could be huge). As a solution, the mysqldump command allows you to specify a table and a <a href="https://yllus.com/2023/10/31/generate-mysql-insert-statements-for-a-few-existing-records/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Occasionally, you&#8217;ll want to duplicate a couple of records from your production MySQL database for local use without dumping the entire table (which could be huge). As a solution, the <strong>mysqldump</strong> command allows you to specify a table and a WHERE query for that table, allowing you to select specific record ID #s and retrieve only those records as INSERT statements:</p>
<pre class="brush: plain; title: ; notranslate">
mysqldump -h {host} -P {port} -u {username} -p{password} {database_name} {table_name} --where=&quot;ID = 1&quot; --no-create-info --no-create-db
</pre>
<p>Reference:</p>
<ul>
<li><a href="https://stackoverflow.com/a/13760493/1290232">Stack Overflow: Get Insert Statement for existing row in MySQL</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2023/10/31/generate-mysql-insert-statements-for-a-few-existing-records/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Upgrade a deprecated AWS Elastic Beanstalk environment in place using the CLI</title>
		<link>https://yllus.com/2022/09/26/upgrade-a-deprecated-aws-elastic-beanstalk-environment-in-place-using-the-cli/</link>
					<comments>https://yllus.com/2022/09/26/upgrade-a-deprecated-aws-elastic-beanstalk-environment-in-place-using-the-cli/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Mon, 26 Sep 2022 15:43:57 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=3354</guid>

					<description><![CDATA[When a major PHP version change (eg. 5.7 to 7.0, or 7.0 to 8.0) occurs, Amazon AWS Elastic Beanstalk typically does not allow for automated platform version updates but instead requires the cloning of an interface and a CNAME switch. <a href="https://yllus.com/2022/09/26/upgrade-a-deprecated-aws-elastic-beanstalk-environment-in-place-using-the-cli/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>When a major PHP version change (eg. 5.7 to 7.0, or 7.0 to 8.0) occurs, Amazon AWS Elastic Beanstalk typically does not allow for automated platform version updates but instead requires the cloning of an interface and a CNAME switch. For less available environments, use the following steps to upgrade-in-place using the AWS command line interface:</p>
<ol>
<li>Take a look at the <a href="https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.PHP">list of currently supported PHP platforms</a> on Elastic Beanstalk; you&#8217;ll want to decide which Solution Stack Name (eg. &#8220;64bit Amazon Linux 2 v3.4.1 running PHP 8.1&#8221;) corresponds to the platform you wish to upgrade to.</li>
<li>In the Elastic Beanstalk web configuration page, get the environment ID for the environment you wish to upgrade (eg. &#8220;e-jwfjvy57r3&#8221;).</li>
<li>Run the aws command to upgrade the environment in place:<br />
<code>aws elasticbeanstalk update-environment --solution-stack-name "64bit Amazon Linux 2 v3.4.1 running PHP 8.1" --environment-id "e-2iuwivbgzc" --region "ca-central-1"</code></li>
</ol>
<p>Reference:</p>
<ul>
<li><a href="https://www.bluekeyboard.com/2022/04/14/how-to-update-php-versions-on-elastic-beanstalk-environments/">Blue Keyboard &#8211; How to update PHP versions on Elastic Beanstalk environments</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2022/09/26/upgrade-a-deprecated-aws-elastic-beanstalk-environment-in-place-using-the-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Measure current IOPS usage on a Linux server</title>
		<link>https://yllus.com/2021/08/11/measure-current-iops-usage-on-a-linux-server/</link>
					<comments>https://yllus.com/2021/08/11/measure-current-iops-usage-on-a-linux-server/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Wed, 11 Aug 2021 13:10:06 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://yllus.com/?p=3333</guid>

					<description><![CDATA[This is most easily measured by installing the sysstat package: sudo yum install sysstat -y And running the sar command, looking at the value of tps: sar -d 1]]></description>
										<content:encoded><![CDATA[<p>This is most easily measured by installing the <strong>sysstat</strong> package:</p>
<pre class="brush: plain; title: ; notranslate">
sudo yum install sysstat -y
</pre>
<p>And running the <strong>sar</strong> command, looking at the value of <strong>tps</strong>:</p>
<pre class="brush: plain; title: ; notranslate">
sar -d 1
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2021/08/11/measure-current-iops-usage-on-a-linux-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Getting a recursive list of files sorted by last modified date in Linux</title>
		<link>https://yllus.com/2021/08/06/getting-a-recursive-list-of-files-sorted-by-last-modified-date-in-linux/</link>
					<comments>https://yllus.com/2021/08/06/getting-a-recursive-list-of-files-sorted-by-last-modified-date-in-linux/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 18:59:37 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://yllus.com/?p=3331</guid>

					<description><![CDATA[Here&#8217;s a quick way to get a recursive list of files, sorted in descending order by the last modified date, from any folder in *nix: find . -type f -printf &#34;%T@ %p&#92;&#48;&#34; &#124; sort -zk1nr &#124; xargs -0 printf &#34;%s\n&#34;]]></description>
										<content:encoded><![CDATA[<p>Here&#8217;s a quick way to get a recursive list of files, sorted in descending order by the last modified date, from any folder in *nix:</p>
<pre class="brush: plain; title: ; notranslate">
find . -type f -printf &quot;%T@ %p&#92;&#48;&quot; | sort -zk1nr | xargs -0 printf &quot;%s\n&quot;
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2021/08/06/getting-a-recursive-list-of-files-sorted-by-last-modified-date-in-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Google&#8217;s comprehensive, up-to-date list of mobile phone and device resolutions</title>
		<link>https://yllus.com/2017/08/04/googles-comprehensive-date-list-mobile-phone-device-resolutions/</link>
					<comments>https://yllus.com/2017/08/04/googles-comprehensive-date-list-mobile-phone-device-resolutions/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Fri, 04 Aug 2017 14:01:44 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2964</guid>

					<description><![CDATA[The fine folks at Google have a page up on their Material Design site that lists popular device resolutions, including exactly what values you&#8217;d want to input into Google Chrome to accurately emulate that device&#8217;s screen: https://material.io/devices/]]></description>
										<content:encoded><![CDATA[<p>The fine folks at Google have a page up on their Material Design site that lists popular device resolutions, including exactly what values you&#8217;d want to input into Google Chrome to accurately emulate that device&#8217;s screen:</p>
<ul>
<li><a href="https://material.io/devices/">https://material.io/devices/</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2017/08/04/googles-comprehensive-date-list-mobile-phone-device-resolutions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What makes a great product manager?</title>
		<link>https://yllus.com/2017/02/12/what-makes-a-great-product-manager/</link>
					<comments>https://yllus.com/2017/02/12/what-makes-a-great-product-manager/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Sun, 12 Feb 2017 18:44:56 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2926</guid>

					<description><![CDATA[There&#8217;s a terrific post by Brandon Chu on Medium titled MVPM: Minimum Viable Product Manager that does a great job at explaining that while it&#8217;s impossible to have in-depth knowledge of the technical, business and user experience legs of the product <a href="https://yllus.com/2017/02/12/what-makes-a-great-product-manager/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s a terrific post by Brandon Chu on Medium titled <a href="https://medium.com/the-black-box-of-product-management/mvpm-minimum-viable-product-manager-e1aeb8dd421#.cebtiu9ch">MVPM: Minimum Viable Product Manager</a> that does a great job at explaining that while it&#8217;s impossible to have in-depth knowledge of the technical, business and user experience legs of the product tripod, knowing key elements in each area makes you so much more able to handle the decision making that you&#8217;ll be doing every minute of the day.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2017/02/12/what-makes-a-great-product-manager/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why I mostly hire generalists</title>
		<link>https://yllus.com/2015/09/08/mostly-hire-generalists/</link>
					<comments>https://yllus.com/2015/09/08/mostly-hire-generalists/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Wed, 09 Sep 2015 00:11:18 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2840</guid>

					<description><![CDATA[I&#8217;ve had the pleasure of getting to build the in-house web development team at Rogers Media for a few years now up from just myself and one other developer to a staff of fifteen. I&#8217;m of the school of thought that <a href="https://yllus.com/2015/09/08/mostly-hire-generalists/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve had the pleasure of getting to build the in-house web development team at Rogers Media for a few years now up from just myself and one other developer to a staff of fifteen. I&#8217;m of the school of thought that software development teams are best kept small: It requires a smaller web of communication, individual team members maintain a high level of impact on the product they&#8217;re building (avoiding a loss of motivation due to <a href="https://en.wikipedia.org/wiki/Ringelmann_effect">the Ringelmann effect</a>), and team stability (that is, people constantly joining or leaving the team) is usually greatly improved.</p>
<p>But there&#8217;s a potential downside that has to be addressed: Software is complex, and the requirements of web development often extremely so. How does a small team come through with everything that&#8217;s needed to make a project work? My answer has been to build the core of the team around generalists &#8211; people who tend to be very good in one area of development, but also knowledgeable and capable in most others as well.</p>
<p>Here&#8217;s <a href="https://yllus.com/2015/09/08/mostly-hire-generalists/">an excerpt from the Pragmatic Programmer series titled Be A Generalist</a> that speaks to why generalists are the answer to meeting a modern business product&#8217;s software needs:</p>
<blockquote><p>For at least a couple of decades, desperate managers and business owners have been pretending that software development is a manufacturing process at heart. Requirements specifications are created, and architects turn these specifications into a high-level technical vision. Designers fill out the architecture with detailed design documentation, which is handed to robot-like coders, who hold pulp-fiction novels in one hand while sleepily typing in the design&#8217;s implementation with the other. Finally, Inspector 12 receives the completed code, which doesn&#8217;t receive her stamp of approval unless it meets the original specifications.</p>
<p>It&#8217;s no surprise that managers want software development to be like manufacturing. Managers understand how to make manufacturing work. We have decades of experience in how to build physical objects efficiently and accurately. So, applying what we&#8217;ve learned from manufacturing, we should be able to optimize the software development process into the well-tuned engine that our manufacturing plants have become.</p>
<p>In the so-called software factory, the employees are specialists. They sit at their place in the assembly line, fastening Java components together or rounding the rough edges of a Visual Basic application on their software lathes. Inspector 12 is a tester by trade. Software components move down the line, and she tests and stamps them in the same way each day. J2EE designers design J2EE applications. C++ coders code in C++. The world is very clean and compartmentalized.</p>
<p>Unfortunately, the manufacturing analogy doesn&#8217;t work. Software is at least as malleable as software requirements. Things change in business, and businesspeople know that software is soft and can be changed to meet those requirements. This means architecture, designs, code, and tests must all be created and revised in a fashion more agile than the leanest manufacturing processes can provide.</p>
<p>In this kind of rapidly changing environment, the flexible will survive. When the pressure is on, a smart businessperson will turn to a software professional can solve the problem at hand. So, how do you become that person whose name comes up when they&#8217;re looking for a superhero to save the day? The key is to be able to solve the problems that may arise.</p>
<p>What are those problems? That&#8217;s right: you don&#8217;t know. Neither do I. What I do know is that those problems are as diverse as deployment issues, critical design flaws that need to be solved and quickly reimplemented, heterogenous system integration, and rapid, ad hoc report generation. Faced with a problem set as diverse as this, poor Inspector 12 would be passed over pretty quickly.</p>
<p>The label jack-of-all-tradesâ€”master of none is normally meant to be derogatory, implying that the labelee lacks the focus to really dive into a subject and master it. But, when your online shopping application is on the fritz, and you&#8217;re losing orders by the hundreds as each hour passes, it&#8217;s the jackof-all-trades who not only knows how the application&#8217;s code works but can also do low-level UNIX debugging of your web server processes, analyze your RDBM&#8217;s configuration for potential performance bottlenecks, and check your network&#8217;s router configuration for hard-to-find problems.</p>
<p>And, more important, after finding the problem, the jack-of-all-trades can quickly make architecture and design decisions, implement code fixes, and deploy a new fixed system to production. In this scenario, the manufacturing scenario seems quaint at best and critically flawed at worst.</p>
<p>Another way in which the software factory breaks down is in that, although in an assembly line the work keeps coming in a steady flow, software projects are usually very cyclical. Not only is the actual flow of projects cyclical, but the work inside a project is cyclical. A coder sits on the bench while requirements are being specified, architected, and designed, or the coder multitasks across many projects. The problem with multitasking coders is that, despite the software factory&#8217;s intentions, when the rubber meets the road, the coders rely a great deal on context and experience to get their jobs done. Requirements, architecture, and design documents can be a great head start, but ultimately if the programmers don&#8217;t understand what the system is supposed to do, they won&#8217;t be able to create a good implementation of the system.</p>
<p>Of course, I&#8217;m not just picking on coders here. The same is true at nearly every spot on the software assembly line. Context matters, and multitasking doesn&#8217;t quite work. As a result, we have an inefficient manufacturing system. There have been various attempts to solve this problem of inefficiency without departing from the manufacturing-inspired system, but we have not yet figured out how to optimize our software factories to an acceptable level.</p>
<p>If you are just a coder or a tester or a designer or an architect, you&#8217;re going to find yourself sitting idle or doing busywork during the ebbs of your business&#8217;s project flow. If you are just a J2EE programmer or a .NET programmer or a UNIX systems programmer, you&#8217;re not going to have much to contribute when the focus of a project or a company shifts, even temporarily, out of your focus area. It&#8217;s not about where you sit on the perceived value chain of project work (where the architect holds the highest spot of royalty). It&#8217;s about how generally useful you make yourself.</p></blockquote>
<p>References:</p>
<ul>
<li><a href="http://media.pragprog.com/titles/mjwti/generalist.pdf">The Pragmatic Programmer: Be A Generalist</a></li>
<li><a href="http://www.qsm.com/blog/2012/part-ii-small-teams-deliver-lower-cost-higher-quality">QSM: Small Teams Deliver Lower Cost, Higher Quality</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2015/09/08/mostly-hire-generalists/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The growth of mobile device usage for the Web isn&#8217;t at the expense of desktop usage</title>
		<link>https://yllus.com/2015/01/02/growth-mobile-device-usage-web-isnt-expense-desktop-usage/</link>
					<comments>https://yllus.com/2015/01/02/growth-mobile-device-usage-web-isnt-expense-desktop-usage/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Sat, 03 Jan 2015 04:08:19 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2784</guid>

					<description><![CDATA[From ComScore &#8211; Is Mobile Bringing About the Death of the PC? Not Exactly, some interesting data: Here we can see that mobile consumption has clearly exploded, with a 44% gain in mobile app usage and a 38% gain in <a href="https://yllus.com/2015/01/02/growth-mobile-device-usage-web-isnt-expense-desktop-usage/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>From <a href="http://www.comscore.com/Insights/Blog/Is-Mobile-Bringing-About-the-Death-of-the-PC-Not-Exactly">ComScore &#8211; Is Mobile Bringing About the Death of the PC</a>? Not Exactly, some interesting data:</p>
<blockquote><p>Here we can see that mobile consumption has clearly exploded, with a 44% gain in mobile app usage and a 38% gain in mobile web usage. This has contributed to mobile growing its share of digital media time spent from 50% to 60% in the past year and owning a clear majority of time spent.</p>
<p>But importantly, desktop usage has held up in the face of increased competition from mobile for consumers&#8217; attention, with a negligible overall decline in total time spent from 477 billion minutes to 466 billion minutes. The net result of is that we&#8217;ve seen a 20% overall increase in time spent on digital in the past year, which means a lot more opportunity to reach consumers and monetize content.</p></blockquote>
<p>As a web developer, this tells me that websites with analytics that tell me that desktop users are predominant aren&#8217;t to be forgotten; mobile Web usage is growing, but native app usage is where people&#8217;s attention is.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2015/01/02/growth-mobile-device-usage-web-isnt-expense-desktop-usage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Downloading more than 5,000 rows from Google Analytics at a time</title>
		<link>https://yllus.com/2013/09/29/downloading-5000-rows-google-analytics-time/</link>
					<comments>https://yllus.com/2013/09/29/downloading-5000-rows-google-analytics-time/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Sun, 29 Sep 2013 14:46:28 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2598</guid>

					<description><![CDATA[I&#8217;ve been increasing the amount of click tracking I do via Google Analytics, but getting the data back out of that system can be a bit of a time when you&#8217;re talking large amounts of data. Enter Download Analytics, which <a href="https://yllus.com/2013/09/29/downloading-5000-rows-google-analytics-time/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve been increasing the amount of click tracking I do via Google Analytics, but getting the data back out of that system can be a bit of a time when you&#8217;re talking large amounts of data.</p>
<p>Enter <a href="http://www.download-analytics.com/">Download Analytics</a>, which will ask for input of a URL to the report page you&#8217;re viewing, and will automatically prompt to e-mail you (when ready) a link that will allow you to download the entire list of rows in your report. Simple, fast, effective.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2013/09/29/downloading-5000-rows-google-analytics-time/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Using XDebug with Aptana Studio 3, nginx and PHP-FPM</title>
		<link>https://yllus.com/2013/01/20/using-xdebug-with-aptana-studio-3-nginx-and-php-fpm/</link>
					<comments>https://yllus.com/2013/01/20/using-xdebug-with-aptana-studio-3-nginx-and-php-fpm/#comments</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Sun, 20 Jan 2013 21:37:49 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2529</guid>

					<description><![CDATA[Instructions on how to step through your PHP code with XDebug seem to be an unholy mess online. After an hour of tinkering in Ubuntu 12.04 to get it working, I&#8217;ve come up with the ten steps listed below to <a href="https://yllus.com/2013/01/20/using-xdebug-with-aptana-studio-3-nginx-and-php-fpm/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Instructions on how to step through your PHP code with <a href="http://xdebug.org/">XDebug</a> seem to be an unholy mess online. After an hour of tinkering in Ubuntu 12.04 to get it working, I&#8217;ve come up with the ten steps listed below to get the combination of Ubuntu, Nginx, PHP-FPM, XDebug and Aptana Studio 3 working together. Here&#8217;s hoping this helps someone else out there.</p>
<p>1. Install php5-xdebug:</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get install php5-xdebug
</pre>
<p>2. Edit the xdebug configuration file /etc/php5/fpm/conf.d/xdebug.ini , most notably changing the default port to 9001 as PHP-FPM itself runs a daemon on port 9000. We also change the log file location to /var/log/xdebug (remember to create this folder):</p>
<pre class="brush: bash; title: ; notranslate">
xdebug.profiler_output_dir=/var/log/xdebug
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=0

xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001
xdebug.remote_handler=dbgp
xdebug.remote_autostart=0
</pre>
<p>3. Restart PHP-FPM:</p>
<pre class="brush: bash; title: ; notranslate">
sudo /etc/init.d/php5-fpm reload
</pre>
<p>4. In Aptana Studio 3, we&#8217;ll start by ensuring that Aptana recognizes XDebug as being installed as a debugger on the system. Go to <b>Window</b> &gt; <b>Preferences</b> &gt; <b>Aptana Studio</b> &gt; <b>Editors</b> &gt; <b>PHP</b> &gt; <b>Debug</b>. Ensure that under <b>Installed Debuggers</b>, XDebug is listed on port 9001.</p>
<p>5. While still in the Preferences window, go to <b>General</b> &gt; <b>Web Browser</b> and change the option to <b>Use external web browser</b>. Leave <b>Default system web browser</b> marked.</p>
<p>6. Close the Preferences window and go to <b>Run</b> &gt; <b>Debug Configurations&#8230;</b> Right-click <b>PHP Web Page</b> and select <b>New</b>.</p>
<p>7. Name your configuration whatever you&#8217;d like (localhost if you&#8217;re lacking ideas). Ensure that <b>Server Debugger</b> is set to XDebug. Create a new <b>PHP Server</b> by clicking the + button, and ensure that you set the <b>Base URL</b> and <b>Document Root</b> properly for the website you are trying to debug.</p>
<p>8. Almost done! We now need to <a href="https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc">Xdebug Helper</a> in the Google Chrome browser. After it&#8217;s installed, enable it on your locally viewed web page by clicking the bug icon until it changes colour to green (if you hover over it, it will inform you that it has debugging enabled).</p>
<p>9. Let&#8217;s switch back to Aptana Studio 3. Under <b>Window</b> &gt; <b>Perspective</b>, switch to <b>Debug</b>. We left the &#8220;Break on first line&#8230;&#8221; option under <b>Window</b> &gt; <b>Preferences</b> &gt; <b>Aptana Studio</b> &gt; <b>Editors</b> &gt; <b>PHP</b> &gt; <b>Debug</b>, but you can just as easily double-click in the margin beside any line in your PHP script to add a breakpoint at that location. Navigate to a page that will execute that PHP script and watch as execution halts and your debugger steps in, giving you the ability to inspect variables or control execution at will.</p>
<p>10. Inspect the value of any variable quickly by adding the Expressions window while in Debug mode at <b>Window</b> &gt; <b>Show View</b> &gt; <b>Expressions</b>. Pop in a variable such as $page and press Enter to see the value immediately.</p>
<p>Need to switch back to regular coding view? Under <b>Window</b> &gt; <b>Perspective</b>, switch to <b>Web</b>. Bear in mind that even outside of the Debug perspective your debugger will be active &#8211; click the bug icon in Chrome until it is grey to disable activating XDebug.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2013/01/20/using-xdebug-with-aptana-studio-3-nginx-and-php-fpm/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Getting Aptana Studio 3 to ignore extremely large folders in your project</title>
		<link>https://yllus.com/2012/08/01/getting-aptana-studio-3-to-ignore-extremely-large-folders-in-your-project/</link>
					<comments>https://yllus.com/2012/08/01/getting-aptana-studio-3-to-ignore-extremely-large-folders-in-your-project/#comments</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Wed, 01 Aug 2012 14:18:04 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2417</guid>

					<description><![CDATA[I&#8217;m in the midst of a website conversion to WordPress, and the resulting import of images to the uploads/ folder is somewhere north of 8 GB. My IDE, Aptana Studio 3, tries to scan the folder every time I refresh <a href="https://yllus.com/2012/08/01/getting-aptana-studio-3-to-ignore-extremely-large-folders-in-your-project/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m in the midst of a website conversion to WordPress, and the resulting import of images to the uploads/ folder is somewhere north of 8 GB. My IDE, Aptana Studio 3, tries to scan the folder every time I refresh the project or do code completion. I was on the verge of ditching Aptana altogether when I hit upon the answer:</p>
<ol>
<li>Move the large folder you wish to have Aptana ignore out of your project and replace it with an empty folder.</li>
<li>Refresh the project to ensure the empty folder appears in the project.
</li>
<li>Right-click on the empty folder and select <strong>Properties</strong>, and then <strong>Resource</strong>.</li>
<li>Under <strong>Attributes</strong>, check <strong>Derived</strong>.</li>
<li>Copy the contents of the folder back into place &#8211; Aptana should ignore it and keep UI responsiveness quick.</li>
</ol>
<p>Sources:</p>
<ul>
<li><a href="http://stackoverflow.com/questions/968643/eclipse-ignore-entire-directories/972450">Stack Overflow: Eclipse &#8211; Ignore Entire Directories</a></li>
<li><a href="http://blog.pengoworks.com/index.cfm/2011/2/23/Excluding-a-folder-or-file-from-being-searched-in-Eclipse">dans.blog &#8211; Excluding a folder or file from being searched in Eclipse</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/08/01/getting-aptana-studio-3-to-ignore-extremely-large-folders-in-your-project/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>The skills gap myth: Survey reveals why companies can&#8217;t find &#8220;good people&#8221;</title>
		<link>https://yllus.com/2012/06/04/the-skills-gap-myth-survey-reveals-why-companies-cant-find-good-people/</link>
					<comments>https://yllus.com/2012/06/04/the-skills-gap-myth-survey-reveals-why-companies-cant-find-good-people/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Mon, 04 Jun 2012 14:17:32 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2397</guid>

					<description><![CDATA[As a software developer I&#8217;m always bemused by the leaders of industry who lament the lack of skilled workers to fill open positions in my field. It seems that too many forget one of the most basic rules of capitalism: <a href="https://yllus.com/2012/06/04/the-skills-gap-myth-survey-reveals-why-companies-cant-find-good-people/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>As a software developer I&#8217;m always bemused by the leaders of industry who lament the lack of skilled workers to fill open positions in my field. It seems that too many forget one of the most basic rules of capitalism: If demand is low, you&#8217;re not offering enough value. As it fits this scenario: If developers aren&#8217;t applying for your position, you&#8217;re not offering enough compensation. </p>
<p>This is rather cynical, but I imagine that these pronouncements aren&#8217;t for my ears anyways: They&#8217;re made to justify keeping <a href="http://www.labour.gov.on.ca/english/es/tools/srt/coverage_government_it.php">&#8220;information technology professionals&#8221; on the overtime exempt list</a>, or to raise immigration caps for technology workers. (Which is often well justified, but I wonder at the distortion it introduces to the domestic labour pool.)</p>
<blockquote><p><a href="http://business.time.com/2012/06/04/the-skills-gap-myth-why-companies-cant-find-good-people/">TIME.com &#8211; The Skills Gap Myth: Why Companies Can&#8217;t Find Good People</a></p>
<p>&#8230;</p>
<p>The first thing that makes me wonder about the supposed â€œskill gapâ€ is that, when pressed for more evidence, roughly 10% of employers admit that the problem is really that the candidates they want won&#8217;t accept the positions at the wage level being offered. That&#8217;s not a skill shortage, it&#8217;s simply being unwilling to pay the going price.</p>
<p>But the heart of the real story about employer difficulties in hiring can be seen in the Manpower data showing that only 15% of employers who say they see a skill shortage say that the issue is a lack of candidate knowledge, which is what we&#8217;d normally think of as skill. Instead, by far the most important shortfall they see in candidates is a lack of experience doing similar jobs. </p>
<p>Employers are not looking to hire entry-level applicants right out of school. They want experienced candidates who can contribute immediately with no training or start-up time. That&#8217;s certainly understandable, but the only people who can do that are those who have done virtually the same job before, and that often requires a skill set that, in a rapidly changing world, may die out soon after it is perfected.</p>
<p><span id="more-2397"></span>&#8230;</p>
<p>Another way to describe the above situation is that employers don&#8217;t want to provide any training for new hires â€” or even any time for candidates to get up to speed. A 2011 Accenture survey found that only 21% of U.S. employees had received any employer-provided formal training in the past five years. Does it make sense to keep vacancies unfilled for months to avoid having to give new hires with less-than-perfect skills time to get up to speed?</p>
<p>Employers further complicated the hiring process by piling on more and more job requirements, expecting that in a down market a perfect candidate will turn up if they just keep looking. One job seeker I interviewed in my own research described her experience trying to land â€œone post that has gone unfilled for nearly a year, asking the candidate to not only be the human resources expert but the marketing, publishing, project manager, accounting and finance expert. When I asked the employer if it was difficult to fill the position, the response was â€˜yes but we want the right fit.&#8217;â€</p>
<p>Another factor that contributes to the perception of a skills gap is that most employers now use software to handle job applications, adding rigidity to the process that screens out all but the theoretically perfect candidate. Most systems, for example, now ask potential applicants what wage they are seeking â€” and toss out those who put down a figure higher than the employer wants. That&#8217;s hardly a skill problem.</p>
<p>Meanwhile, applicants are typically assessed almost entirely on prior experience and credentials, and a failure to meet any one of the requirements leads to elimination. One manager told me that in his company 25,000 applicants had applied for a standard engineering job, yet none were rated as qualified. How could that be? Just put in enough of these yes/no requirements and it becomes mathematically unlikely that anyone will get through.</p>
<p>&#8230;</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/06/04/the-skills-gap-myth-survey-reveals-why-companies-cant-find-good-people/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Heroku&#8217;s Adam Wiggins on how to scale a development team</title>
		<link>https://yllus.com/2012/05/14/herokus-adam-wiggins-on-how-to-scale-a-development-team/</link>
					<comments>https://yllus.com/2012/05/14/herokus-adam-wiggins-on-how-to-scale-a-development-team/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Mon, 14 May 2012 14:41:26 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2368</guid>

					<description><![CDATA[Not much to say here; I think this is an excellent template for growing a software company and this is my way or preserving copy for when I need it. Adam Wiggins &#8211; How To Scale a Development Team As <a href="https://yllus.com/2012/05/14/herokus-adam-wiggins-on-how-to-scale-a-development-team/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>Not much to say here; I think this is an excellent template for growing a software company and this is my way or preserving copy for when I need it.</p>
<blockquote><p><a href="http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/">Adam Wiggins &#8211; How To Scale a Development Team</a></p>
<p>As hackers, we&#8217;re familiar with the need to scale web servers, databases, and other software systems. An equally important challenge in a growing business is scaling your development team.</p>
<p>Most technology companies hit a wall with dev team scalability somewhere around ten developers. Having navigated this process fairly successfully over the last few years at Heroku, this post will present what I see as the stages of life in a development team, and the problems and potential solutions at each stage.</p>
<p><strong>Stage 1: Homebrewing</strong></p>
<p>In the beginning, your company is 2 &#8211; 4 guys/gals working in someone&#8217;s living room, a cafe, or a coworking space. Communication and coordination is easy: with just a few people sitting right next to each other, everyone knows what everyone else is working on. Founders and early employees tend to be very self-directed so the need for management is nearly non-existent. Everyone is a generalist and works on a little bit of everything. You have a single group chat channel and a single all@yourcompany.com mailing list. There&#8217;s no real need to track any tasks or even bugs. A full copy of the state of the entire company and your product is easily contained within everyone&#8217;s brain.</p>
<p>At this stage, you&#8217;re trying to create and vet your minimum viable product, which is a fancy way of saying that you&#8217;re trying to figure out what you&#8217;re even doing here. Any kind of structure or process at this point will be extremely detrimental. Everyone has to be a generalist and able to work on any kind of problem &#8211; specialists will be (at best) somewhat bored and (at worst) highly distracting because they want to steer product development into whatever realm they specialize in.</p>
<p><span id="more-2368"></span><strong>Stage 2: The first hires</strong></p>
<p>Once you&#8217;ve gotten a little funding and been able to hire a few more developers, for a total of 5 &#8211; 9, you may find that the ad-hoc method of coordination (expecting to overhear everything of importance by sitting near teammates) starts to break down. You have both too much communication (keeping tabs on six other people&#8217;s work is time-consuming) and too little communication (you end up colliding on trying to fix the same bug, answer the same support email, or respond to the same Nagios page).</p>
<p>At this point, you want to add just a sprinkle of structure: maybe an iteration planning on Monday, daily standups, and tracking big to-do items and bugs on a whiteboard or in a simple tool like Lighthouse. Perhaps you switch to a support system like Zendesk where incoming support requests can be assigned, and you add a simple on-call rotation for pages via Pagerduty. Your single internal chat and email channels continue to work fine.</p>
<p>Resist the urge to introduce too much structure and process at this point. Some startups, on reaching this stage, declare â€œwe&#8217;ve got to grow up and act like a real company nowâ€ and immediately try to switch to heavy-handed tactics. For example: full-fledged SCRUM, heavyweight tools like Jira, or hiring a project manager or engineering manager. Don&#8217;t do that stuff. You&#8217;ve got a team that works well together in an ad-hoc way; you probably have some natural leaders on the team who direct a lot of the work while still being hands-on themselves; and while your product is launched and in the hands of users, in many ways you&#8217;re still trying to figure out what your company is really all about. Introducing bureaucracy into this environment is almost guaranteed to block you from doing what you&#8217;re really supposed to be doing, which is pivoting in search of your scalable business model.</p>
<p>Focus at this stage is key. Everyone is still a generalist, but the whole development team should be aligned behind a single goal (aka milestone) at a time. If you try to attack multiple battlefronts at once, and you&#8217;ll do everything badly. Great companies are more likely to die indigestion from too much opportunity than starvation from too little. Pick your battles carefully and stay focused.</p>
<p><strong>Crisis on the brink of Stage 3</strong></p>
<p>Grow to 10 &#8211; 15 developers, and you&#8217;re on the verge of a major team structure change. I&#8217;ve been told that many promising startups have been killed by failing to weather the transition between these stages.</p>
<p>With this many developers, iteration planning, standups, or any other kind of development-team meeting has become so big that the attendees spend most of their time bored. Any individual developer will find it difficult to find a sense of purpose or shared direction in the midst of trudging through laundry lists of details on other people&#8217;s work.</p>
<p>In programming, when a class or sourcefile gets to big, the solution is to break it down into smaller pieces. The same principle holds for scaling a development organization. You need to break into targeted teams.</p>
<p><strong>Stage 3: Breaking into teams</strong></p>
<p>Dividing your single team of generalists is harder than it sounds. Draw the fences in the wrong place, and you&#8217;ll create coordination problems that make things even worse. Find the right places to divide and you&#8217;ll see a massive increase in focus, happiness, and productivity.</p>
<p>The key to a good team is a well-defined sphere of authority, with clear interfaces to other teams. The team should own the vision and direction for the part of your product that it works on. It should be able to operate with maximum autonomy on everything it owns without having to ask for permission or information from other teams, except for the infrequent case of a feature or bug that crosses team boundaries.</p>
<p>A close mapping between your software architecture and your team architecture will be a big help here. By this time you have probably already converted your monolithic application into a distributed system of multiple components communicating over REST, AMQP, or other RPC mechanism. (And if not, you should strongly consider doing so, coincident with your dev team split.) There should be an obvious mapping between software components &#8211; each of which has their own source repository and deployment location/procedure &#8211; and your nascent teams.</p>
<p>Deciding what person goes on what team will be somewhat arbitrary at first. My approach was to sit down with each developer and dig in to try to understand what parts of the system they were most passionate about working on. From there I divided up the teams as best I could. Some people found perfect homes on their first team assignment, others were dissatisfied and needed to transfer to another team fairly quickly. Over time, the team territories became very well-defined, so it became much easier to slot new hires in the right place. Let developers follow their own passions and they will gravitate toward the team where they will do the best work.</p>
<p>Separately, you should have found your product/market fit by this point. If you&#8217;ve grown to this size and are still figuring out your company&#8217;s meaning for existence, you&#8217;ve got big problems. If that&#8217;s the case, stop growing, and scale back down until you nail product/market fit.</p>
<p><strong>Specialization</strong></p>
<p>Another reason to break into teams is specialization. Types of engineering specialists include ops engineers/sysadmins, infrastructure developers, front-end web developers, back-end web developers, business engineers / data analysts, and developers who focus on a particular language. Language specialists are becoming more common, because many internet-scale companies write high-concurrency components in functional programming like Erlang, Scala, or Clojure, generally handled by a different set of developers than the authors of the Ruby, Python, or PHP web components.</p>
<p>Early on, specialists are rarely desirable. There&#8217;s too many different layers to work on in delivering a software product relative to the number of people available to contribute, so the everyone pitches in on everything. This may put a developer doing such far-ranging work such as ops projects like kernel updates on the OS, to front-end projects like writing JQuery effects for the UI.</p>
<p>Once you reach the point where you&#8217;ve got a dozen developers, your product has reached a level of usage and maturity where the problems are getting much harder. Scaling the database is something that is not only a full-time job, but requires a deep level of specialized knowledge that can&#8217;t be acquired if that person is also simultaneously learning to be a JQuery expert and an iOS expert and an Erlang expert.</p>
<p>You need people who can and are willing to focus on just a few closely related areas so that they can build very deep knowledge in those areas. Some of these will be your existing generalists deciding to specialize, and some will be new hires. You can now hire for the kind of specialist that would not have been appropriate when your company was smaller. Generalists are always useful to have around, and some of them may move into management &#8211; filling business owner roles for a team, rather than hands-on development.</p>
<p><strong>Heroku&#8217;s first teams</strong></p>
<p>Heroku&#8217;s initial team breakdown looked like this:</p>
<ul>
<li>API &#8211; Owns our user-facing web app and the matching Heroku client gem.</li>
<li>Data &#8211; Builds and runs our PostgreSQL-as-a-service database product.</li>
<li>Ops &#8211; Shepherds and protects availability of the production system.</li>
<li>Routing &#8211; Manages everything necessary to get HTTP requests routed to user web processes.</li>
<li>Runtime &#8211; Handles packaging code for deploy and starting/stopping/managing user processes.</li>
</ul>
<p>Each of these teams owns between one and five components. For example, the API team owns the Rails app which runs at api.heroku.com and the Heroku client gem. The Data team owns the provisioning and monitoring tool for our database service, as well as all of the individual running databases. (Peter van Hardenburg was the intrapreneur who founded and now leads our Data team. He tells a bit of that story in the later part of this video.)</p>
<p><strong>Team size and roles</strong></p>
<p>For us, the ideal team layout has been two developers and one business owner. One developer is not enough over the long term (they need a second pair of eyes on the code, and besides, one is a lonely number). Three developers works fine as well. Get to four or five and things start to become a bit crowded; there may not be enough surface area for them to all work without stepping on each others&#8217; toes constantly. Almost all of Heroku&#8217;s teams have two developers.</p>
<p>â€œBusiness ownerâ€ is a somewhat clumsy term, but it&#8217;s the best we&#8217;ve come to describe the person doing some combination of product management, project management, and general management for the team. The business owner fills the important role of knowing the business value of the team&#8217;s work to the company and how it fits in with the larger product. They can broker cross-team communication, help prioritize projects and tasks by business value, and may provide status reports on the team&#8217;s progress or presentations to the senior executives and/or the entire company to justify the team&#8217;s ongoing existence.</p>
<p>I&#8217;m a fan of hacker-entrepreneurs in the business owner role: a strong technical background means they have an in-depth understanding of the work being done, and are able to command huge respect from those whose work they are directing. This sort of person is not necessarily available for all teams, but find them when you can. In many cases it involves quite a bit of convincing to get a hacker to give up coding as their primary function.</p>
<p>Avoid having developers belong to more than one team. They are makers and need to be able to focus their full attention on their team&#8217;s current projects without distraction or attempts at multitasking. Business owners, however, can sometimes belong to multiple teams. It&#8217;s not always a full-time job, and there are benefits to cross-team communication by having one person be a business owner for two or more related teams.</p>
<p><strong>Cohesion</strong></p>
<p>In the earlier stages, you should avoid attacking on multiple battlefronts, and instead keep all developers focused around a single goal for the company. With creation of fiefdoms for each team, this has changed. Now you can and should attack on multiple battlefronts. Each team should be executing independently against its own goals, and not worrying too much about what other teams are doing.</p>
<p>It&#8217;s awesome to be able to pursue three, four, five big goals simultaneously. A few months after breaking into teams at Heroku, we had a day where three different teams were all releasing major new features. It&#8217;s an incredible feeling.</p>
<p>But now you have a new problem: lack of cohesion. Your decentralized teams are setting their own roadmaps and deciding on features independently. But to avoid fragmentation in your product, someone needs to decide an overall direction and set of product values. More succinctly: you need a strategy.</p>
<p>But this post is long enough as it is. I&#8217;ll save discussion of cohesion and strategy for another time.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/05/14/herokus-adam-wiggins-on-how-to-scale-a-development-team/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Soliciting browser type, version, OS and cookie settings from your users</title>
		<link>https://yllus.com/2012/05/09/soliciting-browser-type-version-os-and-cookie-settings-from-your-users/</link>
					<comments>https://yllus.com/2012/05/09/soliciting-browser-type-version-os-and-cookie-settings-from-your-users/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Wed, 09 May 2012 20:15:52 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2266</guid>

					<description><![CDATA[I lost track of this site and happily re-found it &#8211; tell your website customers to open http://supportdetails.com/ in a new tab when they have issues with your website and to use the form built in to e-mail you their <a href="https://yllus.com/2012/05/09/soliciting-browser-type-version-os-and-cookie-settings-from-your-users/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>I lost track of this site and happily re-found it &#8211; tell your website customers to open <a href="http://supportdetails.com/">http://supportdetails.com/</a> in a new tab when they have issues with your website and to use the form built in to e-mail you their information. Super handy.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/05/09/soliciting-browser-type-version-os-and-cookie-settings-from-your-users/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Terms Of Service page done right (or at least better)</title>
		<link>https://yllus.com/2012/04/12/a-terms-of-service-page-done-right-or-at-least-better/</link>
					<comments>https://yllus.com/2012/04/12/a-terms-of-service-page-done-right-or-at-least-better/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Thu, 12 Apr 2012 16:20:27 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2247</guid>

					<description><![CDATA[The 500px Terms of Service page strikes a great balance (a 50/50 balance, to be precise) between necessary legalese and something the layman can understand.]]></description>
										<content:encoded><![CDATA[<p>The <a href="http://500px.com/terms">500px Terms of Service</a> page strikes a great balance (a 50/50 balance, to be precise) between necessary legalese and something the layman can understand.</p>
<p><center><a href="http://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2012/04/500px_tos.png" rel='magnific'><img src="http://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2012/04/500px_tos.png" alt="" title="500px.com Terms Of Service Page" width="600" height="577" class="aligncenter size-full wp-image-2249" srcset="https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2012/04/500px_tos.png 600w, https://pumpinglemmacompany.nyc3.digitaloceanspaces.com/yllus/wp-content/uploads/2012/04/500px_tos-300x288.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><br />
</center></p>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/04/12/a-terms-of-service-page-done-right-or-at-least-better/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Very basic JSONP</title>
		<link>https://yllus.com/2012/03/05/very-basic-jsonp/</link>
					<comments>https://yllus.com/2012/03/05/very-basic-jsonp/#respond</comments>
		
		<dc:creator><![CDATA[Sully Syed]]></dc:creator>
		<pubDate>Mon, 05 Mar 2012 15:47:29 +0000</pubDate>
				<category><![CDATA[All Entries]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">http://yllus.com/?p=2243</guid>

					<description><![CDATA[JSONP allows you to make HTTP requests outside of your own domain due to the SCRIPT tag not having the same-domain limitation XMLHttpRequest does. The basic form of this workaround is as follows: var scr = document.createElement('script'); scr.src = 'http://openexchangerates.org/latest.json?callback=formatCurrency'; <a href="https://yllus.com/2012/03/05/very-basic-jsonp/"><div class="read-more"><p>Read more &#8250;</p></div><!-- end of .read-more --></a>]]></description>
										<content:encoded><![CDATA[<p>JSONP allows you to make HTTP requests outside of your own domain due to the SCRIPT tag not having the same-domain limitation XMLHttpRequest does. The basic form of this workaround is as follows:</p>
<pre class="brush: jscript; title: ; notranslate">
var scr = document.createElement('script');
scr.src = 'http://openexchangerates.org/latest.json?callback=formatCurrency';
document.body.appendChild(scr);

function formatCurrency(data) {
	// Do stuff with the data that's been returned.
	1;
}
</pre>
<p>Lines 1 &#8211; 3 of the above create a SCRIPT tag in the DOM, defines the URL to retrieve data from and in line 3 makes the request. To continue the execution cycle, the script at openexchangerates.org must wrap its data in a function:</p>
<pre class="brush: jscript; title: ; notranslate">
formatCurrency({ &quot;hello&quot; : &quot;Hi, I'm JSON. Who are you?&quot;})
</pre>
<p>This calls the locally defined function formatCurrency(), which does whatever it needs to do with the returned data. A quick hack to make your API (assuming you control it) work with JSONP would be as follows:</p>
<pre class="brush: php; title: ; notranslate">
// assume $json holds the JSON response
if ($GET&#x5B;'callback'] != '') $json = $GET&#x5B;'callback'].&quot;( $json )&quot;;
return $json;
</pre>
<p>I have yet to test this, but I imagine you could also be much more daring and avoid having to get the following code uploaded to your API of choice. To do this, execute the first bit of JavaScript on this page, and then execute an eval() statement on the data in the manner of the below:</p>
<pre class="brush: jscript; title: ; notranslate">
eval('formatCurrency(' + returned_data + ')');
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://yllus.com/2012/03/05/very-basic-jsonp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
