Julio Biason
11 months ago
1917 changed files with 199095 additions and 1 deletions
@ -0,0 +1,66 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">404: Page not found</h1> |
||||
<p class="lead">Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. <a href=https://blog.juliobiason.me>Head back home</a> to try finding it again.</p> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,92 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">About Me</h1> |
||||
<span class="post-date"> |
||||
2018-11-28 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/meta/">#meta</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/myself/">#myself</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/about-me/">#about me</a> |
||||
|
||||
</span> |
||||
<p>In case it wasn't clear by the URL, this is the blog of <strong>Julio Biason</strong>.</p> |
||||
<p>I'm a software developer/engineer/architect for about 30 years -- which |
||||
doesn't mean I know everything about software |
||||
development/engineering/architecture, but I do try.</p> |
||||
<p>You can contact me over <code>julio "dot" biason "at" pm "dot" me</code>, just convert |
||||
the things in quotes to their symbol and remove the spaces -- and all that |
||||
just because I want to make the life of spammers harder, and sorry about |
||||
making <em>your</em> life harder, but still...</p> |
||||
<p>You can see my random thoughts on <a href="https://functional.cafe/@juliobiason">Functional |
||||
Cafe</a>.</p> |
||||
<p>I do have a Twitter account, but I'm not updating it as often as I do on |
||||
Functional Cafe.</p> |
||||
<p>I do not have a Facebook account -- not anymore.</p> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,43 @@
|
||||
<html> |
||||
<head> |
||||
<title>Zola</title> |
||||
</head> |
||||
<body> |
||||
<div class="container"> |
||||
<h1>Welcome to Zola!</h1> |
||||
<p> |
||||
You're seeing this page because we couldn't find a template to render. |
||||
</p> |
||||
<p> |
||||
To modify this page, create a <b>section.html</b> file in the templates directory or |
||||
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>. |
||||
<br> |
||||
You can find what variables are available in this template in the <a href="https://www.getzola.org/documentation/templates/pages-sections/#section-variables" target="_blank">documentation</a>. |
||||
</p> |
||||
</div> |
||||
<footer> |
||||
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a> |
||||
</footer> |
||||
<style> |
||||
html { |
||||
line-height: 1.5; |
||||
} |
||||
h1 { |
||||
margin-bottom: 2rem; |
||||
} |
||||
.container { |
||||
font-family: "sans-serif"; |
||||
text-align: center; |
||||
margin-top: 20vh; |
||||
padding: 2rem; |
||||
background: #e9e9e9; |
||||
} |
||||
footer { |
||||
position: fixed; |
||||
width: 100%; |
||||
bottom: 1rem; |
||||
text-align: center; |
||||
} |
||||
</style> |
||||
</body> |
||||
</html> |
@ -0,0 +1,88 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Announcing JulioBiason.Net 4.0</h1> |
||||
<span class="post-date"> |
||||
2018-11-28 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/meta/">#meta</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/blog/">#blog</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/zola/">#zola</a> |
||||
|
||||
</span> |
||||
<p>Short version: New new blog engine and layout.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Long version: Just to change things a bit, I moved my blog from |
||||
<a href="http://blog.getpelican.com/">Pelican</a> to <a href="https://www.getzola.org/">Zola</a>, for |
||||
absolutely no good reason. Actually, there is one good reason: Zola is a single |
||||
binary that I can carry around with my blog content, so I don't need to worry |
||||
about Python and VirtualEnv and download packages (although those things are a |
||||
breeze with Python).</p> |
||||
<p>But, for the sake of contantly changing and breaking stuff.... new engine!</p> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,43 @@
|
||||
<html> |
||||
<head> |
||||
<title>Zola</title> |
||||
</head> |
||||
<body> |
||||
<div class="container"> |
||||
<h1>Welcome to Zola!</h1> |
||||
<p> |
||||
You're seeing this page because we couldn't find a template to render. |
||||
</p> |
||||
<p> |
||||
To modify this page, create a <b>section.html</b> file in the templates directory or |
||||
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>. |
||||
<br> |
||||
You can find what variables are available in this template in the <a href="https://www.getzola.org/documentation/templates/pages-sections/#section-variables" target="_blank">documentation</a>. |
||||
</p> |
||||
</div> |
||||
<footer> |
||||
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a> |
||||
</footer> |
||||
<style> |
||||
html { |
||||
line-height: 1.5; |
||||
} |
||||
h1 { |
||||
margin-bottom: 2rem; |
||||
} |
||||
.container { |
||||
font-family: "sans-serif"; |
||||
text-align: center; |
||||
margin-top: 20vh; |
||||
padding: 2rem; |
||||
background: #e9e9e9; |
||||
} |
||||
footer { |
||||
position: fixed; |
||||
width: 100%; |
||||
bottom: 1rem; |
||||
text-align: center; |
||||
} |
||||
</style> |
||||
</body> |
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - One Version To Add, One Version To Remove</h1> |
||||
<span class="post-date"> |
||||
2019-07-30 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/versions/">#versions</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/upgrades/">#upgrades</a> |
||||
|
||||
</span> |
||||
<p>A lot of things change during development. One day you need a field, another |
||||
day that field may be completely different. For those cases, use one version |
||||
to add the new field and another to remove.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>You have a database with a lot of customers and their ID is numerical. But for |
||||
some reason, they now need to be strings. Instead of changing the field type |
||||
and doing a whole migration, make a deploy with a new field, in which you'll |
||||
keep the old <em>and</em> the new format going on and, in the next release, remove |
||||
the old field. No downtime. You can even run the migration while the system is |
||||
up, since the new field won't be used.</p> |
||||
<p>(I'm simplifying the problem a lot here, 'cause the customer would have |
||||
references all around your system, but you get the point, right?)</p> |
||||
<p>I had a problem in which we store the link for an object directly in the |
||||
backend (we shouldn't, that's a frontend problem, but that's a discussion for |
||||
another time); our interface is changing and so should the link. If we did a |
||||
change in the link directly, that would mean the backend would have to be |
||||
deployed <em>at the same time</em> as the new interface; by adding the new link |
||||
format in another field, we can deploy the backend easily without breaking the |
||||
current system.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/transparent">Be Transparent With The User</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/monitoring">Learn To Monitor</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Always Use A Version Control System</h1> |
||||
<span class="post-date"> |
||||
2019-07-08 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/source-control/">#source control</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/vcs/">#vcs</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/git/">#git</a> |
||||
|
||||
</span> |
||||
<p>"This is my stupid application that I just want to learn something" is not |
||||
even a good excuse to not use a version control system.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A very long time ago, using a source control system (or Version Control |
||||
System) required installing a server, configuring it properly, installing the |
||||
client and <em>then</em> you could keep track of the changes you were doing on your |
||||
code.</p> |
||||
<p>Today there are lots of options that can work in a standalone fashion: Just |
||||
install the client and you're done (well, mostly done, you still need to |
||||
initialize the environment, but that is mostly straightforward these days).</p> |
||||
<p>And, again, there is no good reason to not start a project, as simple as it |
||||
will be, without a version control.</p> |
||||
<p>The VCS will allow you to explore new changes without breaking the main code. |
||||
It will allow you to save a half-way change to make a complete different |
||||
change.</p> |
||||
<p>And, in the long, since you'll end up with working in team and will be |
||||
required to use a VCS, you'll be used to using one.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/languages-docs">Good Languages Come With Integrated Documentation</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/one-change-commit">One Commit Per Change</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Even for Application Composition, Start Stupid</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/composition/">#composition</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/microservices/">#microservices</a> |
||||
|
||||
</span> |
||||
<p>Application composition may lead to microservices -- which is good -- but |
||||
microservices require some ideas about how applications "talk" between them |
||||
over the wire (protocols and such) which you don't need to start with.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Again, because you just want to simplify your work, you can make the |
||||
applications use files directly: Have your first application generate two |
||||
files and the second application receive the file names from <a href="/books/things-i-learnt/command-line-options">the command |
||||
line</a>. There, simple and stupid, |
||||
and works.</p> |
||||
<p>You can even make the first application, instead of generating a file, just |
||||
send its result on the standard output, and have the second application |
||||
receive the data from the standard input -- both of which are managed as |
||||
files, anyway. Then, with a bit of magic, you can put everything together |
||||
without wasting space.</p> |
||||
<p>Worry about talking over the wire later, when you understand how networks |
||||
work.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/application-composition">Not Just Function Composition, But Application Composition</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/log-events">Logs Are For Events, Not User Interface</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,124 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Not Just Function Composition, But Application Composition</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/composition/">#composition</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/applications/">#applications</a> |
||||
|
||||
</span> |
||||
<p>When we were discussing <a href="/books/things-i-learnt/magical-number-seven">the magical number |
||||
seven</a>, I mentioned that it made |
||||
more sense to actually call the functions in sequence instead of each calling |
||||
the next. That's basically a "function composition", one thing you can also do |
||||
with your applications.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Unix came with the idea of "applications that do one thing and do it well". |
||||
And then you could just pick the output of one application and plug it as |
||||
input of another (and then plug the output of the second into a third, and so |
||||
on).</p> |
||||
<p>Also, I mentioned that you could use <a href="/books/things-i-learnt/config-file">configuration |
||||
files</a> to do the same processing over |
||||
different source elements (based on a configuration, that is) instead of |
||||
writing an application that would process both in a single shot.</p> |
||||
<p>One problem with that approach is that you may need <em>both</em> results to actually |
||||
produce a usable result (for example, how would you build a list of common |
||||
followings of two Twitter users if you don't have both lists?).</p> |
||||
<p>That problem can easily be solved if you write a different application that |
||||
just receives both lists and compare them. That would greatly simplify your |
||||
general codebase 'cause instead of one massive codebase with lots of moving |
||||
pieces, you'd have two small codebases, with less moving pieces. One could |
||||
still break the other -- say, if you or someone else changes the result of the |
||||
first function -- but you will still get the results of the first without |
||||
missing the whole 'cause the second is breaking.</p> |
||||
<p>PS: I reckon it's really hard to create application composition with graphical |
||||
applications (why would you ask your user to have <em>two</em> applications open at |
||||
the same time to make something work?) but you can extrapolate this for almost |
||||
everything else.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/command-line-options">Command Line Options Are Weird, But Helpful</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/app-composition-stupid">Even for Application Composition, Start Stupid</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Don't Defend Bad Code</h1> |
||||
<span class="post-date"> |
||||
2019-07-31 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/bad-code/">#bad code</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/defend/">#defend</a> |
||||
|
||||
</span> |
||||
<p>Bad code exists everywhere. You shouldn't defend it, even if it is your own |
||||
code.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Bad code isn't bad on purpose. It sadly happens. But because it is bad, you |
||||
shouldn't defend it.</p> |
||||
<p>For example, an application does whatever you need. But it crashes from time |
||||
to time. Software shouldn't crash and you shouldn't defend it just because it |
||||
does whatever you need.</p> |
||||
<p>Your internal application works on a single browser. That's bad. "But maybe |
||||
the other devs thought it wouldn't be worth working on all browsers". No. It |
||||
is <em>bad</em>. You shouldn't defend the other devs because they decided to focus on |
||||
a single browser due whatever problems they were facing. Sure it wasn't nice |
||||
that they had to do this trade-off, but it is still <em>bad</em> software.</p> |
||||
<p>If we keep defending this kind of software, we will still get bad software.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/own-your-shit">Own Your Shit</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/blogging/">#blogging</a> |
||||
|
||||
</span> |
||||
<p>You may feel "I'm not start enough to talk about this" or "This must be so |
||||
stupid I shouldn't talk about it". Don't.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Create a blog. Post about your stupid solutions. They are still smarter than |
||||
someone else's solution.</p> |
||||
<p>Also, come back later and fight your own solutions with better ones.</p> |
||||
<p>Show your growth.</p> |
||||
<p>But do yourself a favour and turn off comments. Unfortunately, the internet is |
||||
a toxic place and the fears you may have are created by a small portion of it |
||||
that doesn't care about people learning.</p> |
||||
<p>Focus on your work. Focus on whatever you are thinking. Post about your |
||||
speculations if something would work. Revisit them later. Answer yourself. All |
||||
that will show that you're interested in the field and will count points |
||||
towards you.</p> |
||||
<p>There are several options on where to blog; even Github/Gitlab can be used to |
||||
blogging, using their Pages features.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/small-world">I.T. World Is Really Small</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/post-solution">Don't Hide Your Stupid Solution</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Don't Use Booleans As Parameters</h1> |
||||
<span class="post-date"> |
||||
2019-06-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/booleans/">#booleans</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/functions/">#functions</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/parameters/">#parameters</a> |
||||
|
||||
</span> |
||||
<p>When you're designing a function, you may be tempted to add a flag (a |
||||
parameter in a function that it is a boolean). Don't do this.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Here, let me show you an example: Suppose you have a messaging system and you |
||||
have a function that returns all the messages to an user, called |
||||
<code>getUserMessages</code>. But there is a case where you need to return a summary of |
||||
each message (say, the first paragraph) or the full message. So you add a |
||||
flag/Boolean parameter called <code>retrieveFullMessage</code>.</p> |
||||
<p>Again, don't do that.</p> |
||||
<p>'Cause anyone reading your code will see <code>getUserMessage(userId, true)</code> and |
||||
wonder what the heck that <code>true</code> means.</p> |
||||
<p>You can either rename the function to <code>getUserMessageSummaries</code> and have |
||||
another <code>getUserMessagesFull</code> or something around those lines, but each |
||||
function just call the original <code>getUserMessage</code> with true or false -- but the |
||||
interface to the outside of your class/module will still be clear.</p> |
||||
<p>But <em>don't</em> add flags/Boolean parameters to your API.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/future-trashing">Future Thinking is Future Trashing</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/interface-changes">Beware of Interface Changes</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,119 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Understand And Stay Away From Cargo Cult</h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/cargo-cult/">#cargo cult</a> |
||||
|
||||
</span> |
||||
<p>"<a href="https://en.wikipedia.org/wiki/Cargo_cult">Cargo cult</a>" is a type of cult |
||||
which appeared in the Melanesia, in which the natives would build their copy |
||||
of an airplane (no motor, 'cause they didn't have the knowledge to build one |
||||
-- or even knew what went inside the airplane) in the hopes they would get the |
||||
same results as a real airplane.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>In IT, a "cargo cult" is the expectation that if you use the same tools as |
||||
some big players, you'd end up getting the same results.</p> |
||||
<p>One example: Netflix runs a large fleet of microservices daily; they use |
||||
Spring Cloud; if we use Spring Cloud, we can also run a large fleet of |
||||
microservices.</p> |
||||
<p>Although it may sound correct in a first glance, things are not like that. |
||||
There is much more to the Netflix fleet than just Spring Cloud.</p> |
||||
<p>Sometimes, cargo cult can appear in a form of "fanaticism" about celebrities: |
||||
<a href="https://en.wikipedia.org/wiki/Martin_Fowler_(software_engineer)">Fowler</a> said |
||||
such and such pattern works this way and that's exactly what we should do. |
||||
Just because Fowler is well know software engineer and architect and do have |
||||
some very clever ideas, picking them and running exactly the way he described |
||||
may do more harm than good -- basically, 'cause you'd end up applying a |
||||
design pattern without worrying about solving your problem in the first place.</p> |
||||
<p>Another example: "ProductX is sponsored by BigCompany, so it's good". It may |
||||
be, but the fact that BigCompany is being ProductX doesn't immediately makes |
||||
ProductX good, or even if it fits your solution. And there is much more |
||||
<a href="/books/things-i-learnt/languages-are-more">behind a product</a> than just its |
||||
development.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/languages-are-more">A Language Is Much More Than A Language</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/right-tool-agenda">Right Tool For The Job Is Just To Push An Agenda</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Code of Conduct Protect YOU, Not THEM</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/coc/">#coc</a> |
||||
|
||||
</span> |
||||
<p>When you're beginning with any language/library/framework, check their CoC; |
||||
they will protect <em>you</em> from being harassed for not immediately getting what |
||||
is going on instead of blocking you from telling them what you think.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I'm mentioning this 'cause a lot of people complain about CoC, but they |
||||
forget that they allow them to join in any project without being called |
||||
"freaking noob" or "just go read the docs before annoying us".</p> |
||||
<p>And don't be afraid to ask moderators if someone that seems be in the |
||||
community for longer than you isn't break the CoC. Just because you just got |
||||
into the community, it doesn't mean you can't be part of it or that someone |
||||
can abuse their position of "veteran" to not respect you.</p> |
||||
<p>Also, remember that most people that are against CoCs are the ones that want |
||||
to be able to call names on everyone.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/time-to-stop">When It's Time to Stop, It's Time To Stop</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/say-no">Learn To Say No</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,128 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Code Formatting Tools Are Ok, But No Silver Bullet</h1> |
||||
<span class="post-date"> |
||||
2019-07-16 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-formatting/">#code formatting</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-style/">#code style</a> |
||||
|
||||
</span> |
||||
<p>One thing a team may decide to fix the continuous flux of code style comments |
||||
in a code review is to use a code formatting tool to auto-format the code. |
||||
That's ok, but they should never rely on it.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Now yeah, that kinda solves the problem, but there is one small problem: |
||||
we, humans, are not as flexible to read code as computers are; what is |
||||
readable by a computer may not be readable by a human. Surely they try to |
||||
create some heuristics on what is good for human reading, but that doesn't mean |
||||
it gets right.</p> |
||||
<p>Also, unless you start from scratch to use the auto-formatting tool or do a |
||||
change in all files in one single go, you should never assume it will do a |
||||
good job.</p> |
||||
<p>I've seen tools like this implemented in a commit hook, in a way that the tool |
||||
would reformat the code just before adding it to the repository. The biggest |
||||
problem is that, in that team, we didn't run the auto-formatting tool in the |
||||
whole project before hand, and we also added a coverage tool (that checked the |
||||
coverage on the changed parts of the file) without every running the coverage |
||||
tool on everything. The result is that, suddenly, a lot of commits got refused |
||||
because the auto-formatting tool was changing lines that the developer didn't |
||||
change (it changed old code) and suddenly the coverage tool noted the missed |
||||
tests and decided it was no good.</p> |
||||
<p>So good, punctual changes were suddenly being blocked 'cause instead of doing |
||||
the whole thing in a single shot, people decided it was a good idea to let the |
||||
code evolve till everything fixed itself.</p> |
||||
<p>On top of that, some people who were neither in the mood to actually add the |
||||
tests or worried about style found a way to do the commits <em>without running |
||||
the hook</em>, so they basically skipped the whole "let's improve our code" and |
||||
let fuck all.</p> |
||||
<p>So, it's ok if you run the auto-formatting tool for yourself, but you need to |
||||
have the maturity and responsibility to watch yourself and be willing to fix |
||||
and take responsibility for other people's code when the formatter changes |
||||
their code.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/code-review-styles">Code Reviews Are Not For Style</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/code-style">Code Style: Follow It</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Code Reviews Are Not For Style</h1> |
||||
<span class="post-date"> |
||||
2019-07-16 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-reviews/">#code reviews</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-style/">#code style</a> |
||||
|
||||
</span> |
||||
<p>When doing code reviews, do not focus on style; focus on design things that |
||||
look a bit weird.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Code reviews are designed to spread knowledge around the team, with focus on |
||||
construction and problem description. Does the sequence of code gives you an |
||||
understanding on what it is trying to do? Does it contains something you know |
||||
it will make things harder to read in the future? Does it miss the point?</p> |
||||
<p>That's the things you should focus.</p> |
||||
<p>If the author of the code missed a space here, left a blank line there... |
||||
that's of no consequence in a code review. This is not the thing to discuss in |
||||
the code review.</p> |
||||
<p>And people <em>hate</em> people who go through code reviews just to point |
||||
missing/extra spaces and lines.</p> |
||||
<p>On the other hand, if you find something weird in the code which is something |
||||
you want the author to recheck, <em>then</em> you're free to comment that "it would |
||||
be good" if they fix the style. But that's it.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/right-tool-obvious">The Right Tool Is More Obvious Than You Think</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/right-tool-obvious">The Right Tool Is More Obvious Than You Think</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Code Style: Follow It</h1> |
||||
<span class="post-date"> |
||||
2019-07-16 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-style/">#code style</a> |
||||
|
||||
</span> |
||||
<p>If your project have a defined code style, you must follow it. Sometimes it |
||||
may not be clear ("this struct/class should be singular or plural"?), but do |
||||
your best to follow it.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>If your project doesn't have a style, maybe it's time to pick one. There are |
||||
well established styles for almost every language today, so you can start with |
||||
that. You can even make your changes, but you need to realize that since it's |
||||
been established for a while, a lot of other people are using that style and, |
||||
thus, if you keep as is, your code will mesh better with the rest of the |
||||
ecosystem.</p> |
||||
<p>And remember that even your stupid code is <a href="/books/things-i-learnt/languages-are-more">part of the ecosystem of the |
||||
language</a> and the better you |
||||
interact with the ecosystem, the better citizen in the ecosystem you are.</p> |
||||
<p><strong>TIP</strong>: If you don't have a code style yet, and you're using a language |
||||
that's derived from C or C++, use <a href="https://en.wikipedia.org/wiki/Indentation_style#K&R_style">K&R |
||||
Style</a>; if you're |
||||
working with Python, there is only one style: |
||||
<a href="https://www.python.org/dev/peps/pep-0008/">PEP8</a>.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/code-formatters">Code Formatting Tools Are Ok, But No Silver Bullet</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/google-code-style">... Unless That Code Style Is The Google Code Style</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,133 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Cognitive Cost Is The Readability Killer</h1> |
||||
<span class="post-date"> |
||||
2019-06-26 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/cognitive-dissonance/">#cognitive dissonance</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/cognitive-cost/">#cognitive cost</a> |
||||
|
||||
</span> |
||||
<p>"<a href="https://en.wikipedia.org/wiki/Cognitive_dissonance">Cognitive dissonance</a>" |
||||
is a fancy way of saying "I need to remember two (or more) different and |
||||
contradicting things at the same time to understand this." Keeping those |
||||
different things in your head creates a cost and it keeps accumulating the |
||||
more indirect the things are ('cause you'll have to keep all those in your |
||||
head).</p> |
||||
<span id="continue-reading"></span> |
||||
<p>(Disclaimer: I like to use the expression "cognitive dissonance" to make me |
||||
sound smarter. I usually explain what it means, though.)</p> |
||||
<p>To give you an example of a (very mild) cognitive cost, I'll show you this:</p> |
||||
<ul> |
||||
<li>You have a function called <code>sum()</code>. It does the sum of the numbers of a |
||||
list.</li> |
||||
<li>You have another function, called <code>is_pred()</code>. It gets a value and, if it |
||||
fits the predicate -- a test, basically -- returns True; otherwise, |
||||
returns False.</li> |
||||
</ul> |
||||
<p>So, pretty simple, right? One function sums numbers and another returns a |
||||
boolean.</p> |
||||
<p>Now, what would you say if I shown you this, in Python:</p> |
||||
<pre data-lang="python" style="background-color:#2b303b;color:#c0c5ce;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#96b5b4;">sum</span><span>(</span><span style="color:#bf616a;">is_pred</span><span>(x) </span><span style="color:#b48ead;">for </span><span>x </span><span style="color:#b48ead;">in </span><span>my_list) |
||||
</span></code></pre> |
||||
<p>Wait, didn't I say that <code>sum()</code> sums numbers? And that <code>is_pred()</code> returns a |
||||
boolean. How can I sum booleans? What's the expected result of True + True + |
||||
False?</p> |
||||
<p>Sadly, this works. Because someone, long time ago, didn't think booleans were |
||||
worth a thing and used an integer instead. And everyone else since then did |
||||
the same stupid mistake.</p> |
||||
<p>But, for you, you'll now read a line that says "summing a boolean list returns |
||||
a number". And that's two different, disparate things that you suddenly have |
||||
to keep in mind when reading that line.</p> |
||||
<p>That's why <a href="/books/things-i-learnt/data-types">types are important</a>. Also, |
||||
this may sound a bit like <a href="/books/things-i-learnt/magical-number-seven">the magical number |
||||
seven</a>, 'cause you have to keep |
||||
two things at your mind at the same thing but, although that's not near seven, |
||||
they are not the same, with opposite (for weird meanings of "opposite", in |
||||
this case) meanings.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/magical-number-seven">The Magic Number Seven, Plus Or Minus Two</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/functional-programming">Learn The Basics of Functional Programming</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Command Line Options Are Weird, But Helpful</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/configuration/">#configuration</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/command-line-options/">#command line options</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/cli/">#cli</a> |
||||
|
||||
</span> |
||||
<p>In this day and age, when everything has a graphical interface, does it still |
||||
makes sense to add command line options to your application? In fact, it does.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>When I mentioned the configuration file, you may have thought about using |
||||
adding a default path for it and using the same file over and over.</p> |
||||
<p>Well, that's not wrong, but what if you want to use a different configuration? |
||||
Would you keep moving the original configuration file to another place, moving |
||||
your configuration back and keep this back and forth? Keep both versions and |
||||
just use a <a href="https://en.wikipedia.org/wiki/Symbolic_link">symbolic link</a> with |
||||
the configuration filename pointing to the one you want?</p> |
||||
<p>Why not add a command line option in which the user can select which |
||||
configuration file should be loaded?</p> |
||||
<p>This would make their life <em>and yours</em> easy.</p> |
||||
<p>Also, be aware that, today, there may be libraries to handle command line in |
||||
every language, which will help you build a good command line interface, along |
||||
with standardizing it to have the same interface as other applications.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/config-file">The Config File Is Friend</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/application-composition">Not Just Function Composition, But Application Composition</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,135 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - The Config File Is Friend</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/configuration/">#configuration</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/config-file/">#config file</a> |
||||
|
||||
</span> |
||||
<p>Do not ignore the power of configuration files.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Imagine you wrote a function that you have to pass a value for it to start |
||||
processing (say, a twitter user account id). But then you have to do that with |
||||
two values and you just call the function again with the other value.</p> |
||||
<p>It makes more sense to use a config file and just run the application twice |
||||
with two different config files 'cause, this way, you have a single, small, |
||||
testable application instead of two, or a very complex application that does a |
||||
lot of stuff.</p> |
||||
<p>We can even jump into the idea of <a href="/books/things-i-learnt/libraries">creating |
||||
libraries</a> and say that, instead of |
||||
splitting your e-commerce application into smaller parts and making a big one |
||||
by grouping these smaller parts, you could simply have one e-commerce |
||||
application and, for each of your clients, you would have a different |
||||
configuration file, pointing to different assets. This way, even the assets |
||||
may reside in the same repository in the same branch, 'cause all that |
||||
identifies which assets should be used are defined in the configuration file.</p> |
||||
<p>"But which one should I use?" you may ask. Well, "it depends". It may make |
||||
sense to have one single application with different configuration files if |
||||
most of its can be used all the time. If the intersection of used things is |
||||
very small, it may make more sense to split into different libraries and just |
||||
"pick and chose" what to use.</p> |
||||
<p>But besides the replacement of libraries, you can also think things like: "Ok, |
||||
I have to remove elements after a while<sup class="footnote-reference"><a href="#1">1</a></sup>; but which would be a good time |
||||
that they can exist before I can remove them?" Well, if you're not quite sure |
||||
(and, sometimes, even when you're sure), you can use a configuration file to |
||||
define how long those elements will stay in the system before being expunged. |
||||
Maybe you're not even thinking about how long each element will stay in the |
||||
system, but how many of those elements you'll keep in the system before |
||||
removing the old ones -- which is, again, a good candidate to be moved to a |
||||
configuration file.</p> |
||||
<p>Configuration files allow you to change properties of the system without |
||||
recompiling everything. And, if in the future you decide to follow the <a href="https://en.wikipedia.org/wiki/Twelve-Factor_App_methodology">12 |
||||
Factor app</a>, |
||||
you'll find that you're half-way through it.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>In other words, they have a <a href="https://en.wikipedia.org/wiki/Time_to_live">time to |
||||
live</a>.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/permanent-solution">Nothing More Permanent Than A Temporary Solution</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/command-line-options">Command Line Options Are Weird, But Helpful</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,129 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - It's Better To Let The Application Crash Than Do Nothing</h1> |
||||
<span class="post-date"> |
||||
2019-06-24 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/exceptions/">#exceptions</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/error-handling/">#error handling</a> |
||||
|
||||
</span> |
||||
<p>Although that sounds weird, it's better to not add any error handling than |
||||
silently capturing errors and doing nothing.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>For example, a (sadly common) example of Java code:</p> |
||||
<pre data-lang="java" style="background-color:#2b303b;color:#c0c5ce;" class="language-java "><code class="language-java" data-lang="java"><span style="color:#b48ead;">try </span><span>{ |
||||
</span><span> </span><span style="color:#bf616a;">something_that_can_raise_exception</span><span>() |
||||
</span><span>} </span><span style="color:#b48ead;">catch </span><span>(</span><span style="color:#ebcb8b;">Exception </span><span style="color:#bf616a;">ex</span><span>) { |
||||
</span><span> </span><span style="color:#ebcb8b;">System</span><span>.out.</span><span style="color:#bf616a;">println</span><span>(ex); |
||||
</span><span>} |
||||
</span></code></pre> |
||||
<p>This does nothing to deal with the exception -- besides printing it, that is.</p> |
||||
<p>The example may be a bit bad, 'cause Java forces capturing exceptions on |
||||
functions that throw exceptions and it forces functions to mark themselves as |
||||
throwing exceptions if there a <code>throw</code> in them.</p> |
||||
<p>But Python doesn't have this restriction and people <em>still</em> try to capture |
||||
exceptions for doing absolutely nothing -- and, worse, just keep the execution |
||||
going.</p> |
||||
<p>If the language allows it, you should let the application crash due the lack |
||||
of error handling -- as long as you don't have any idea on how to handle it. |
||||
Then, when they crash, you can think of a way to deal with it, instead of |
||||
silently capturing it and doing nothing.</p> |
||||
<p>Also, keep in mind to not go forth and capture <em>every</em> exception/error in a |
||||
single take -- like the example above, which will capture every exception, or |
||||
like <code>except Exception</code> in Python. This last example actually happened to me |
||||
when another developer added this "broad except"<sup class="footnote-reference"><a href="#1">1</a></sup> in a network code and, at |
||||
some point, the code would get into the capture all the time. We checked every |
||||
cable, every connection, every interface, till I noticed there was a syntax |
||||
error in the code. In Python, syntax errors raise exceptions and, because we |
||||
had a "capture all exceptions", we lost some pretty good time looking for the |
||||
problem in the wrong place.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>As called by Pylint.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/interface-changes">Beware of Interface Changes</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/handle-it">If You Know How To Handle It, Handle It</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Thinking Data Flow Beats Patterns</h1> |
||||
<span class="post-date"> |
||||
2019-06-26 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/data-flow/">#data flow</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/design-patterns/">#design patterns</a> |
||||
|
||||
</span> |
||||
<p>When you're trying to find a solution to your problem, think on the way the |
||||
data will flow through your code.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Instead of focusing on design patterns, a better way is to think the way the |
||||
data will flow -- and be transformed -- on your code.</p> |
||||
<p>For example, the user will input a number. You'll get this number and find the |
||||
respective record on the database. This is a transformation -- no, it's not |
||||
"I'll get the number and receive a complete different thing based upon it", |
||||
you're actually transforming the number into a record, using the database as a |
||||
transformation.</p> |
||||
<p>(Yes, I know, it's not that clear at the first glance, but you have to think |
||||
that they are the same data with different representations.)</p> |
||||
<p>Most of the time I did that, I managed to come with more clear design for my |
||||
applications. I didn't even think about how many functions/classes it would be |
||||
needed to do these kind of transformations, that was something I came up |
||||
<em>after</em> I could see the data flow.</p> |
||||
<p>In a way, this way of thinking gets things more clear 'cause you have a list |
||||
of steps of transformations you need to do, so you can write them one after |
||||
another, which prevents a lot of bad code in the future.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/patterns-not-solutions">Design Patters Are Used to Name Solution, Not Find Them</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/magical-number-seven">The Magic Number Seven, Plus Or Minus Two</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Types Say What You Data Is</h1> |
||||
<span class="post-date"> |
||||
2019-06-24 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/types/">#types</a> |
||||
|
||||
</span> |
||||
<p>Memory is just a sequence of bytes; bytes are just numbers from 0 to 255; what |
||||
those numbers mean is described on the language type system.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>For example, in C, a <code>char</code> type of value 65 is most probably the letter "A", |
||||
which an <code>int</code> of value is 65 is the number 65.</p> |
||||
<p>Remember this when dealing with your data.</p> |
||||
<p>And it doesn't matter of your language of choice uses dynamic typing or static |
||||
typing. The same still applies.</p> |
||||
<p>One classic example of misusing types is adding booleans. Booleans are either |
||||
<code>true</code> or <code>false</code>, but because most languages follow C, which doesn't have a |
||||
boolean type and uses compiler pre-processors to define <code>TRUE</code> as an integer |
||||
with the value <code>1</code> and <code>FALSE</code> with another integer with the value <code>0</code>. Newer |
||||
languages were build on top of what older developers knew, and so, a bunch of |
||||
those languages also assumed using an integer under booleans was a good idea. |
||||
And even today, with modern languages, people rely on those old methods.</p> |
||||
<p>Let me repeat that: You're adding booleans and expecting a number -- only |
||||
because in the old times there wasn't boolean types.</p> |
||||
<p>No, you're counting the number of elements in the list 'cause that would see |
||||
the whole list. You're not even filtering the false values over and counting |
||||
the resulting list size. You're jumping the underlying type to get a bit of |
||||
performance out.</p> |
||||
<p>Fortunately, some new languages are using booleans as a complete different |
||||
type and wouldn't allow this kind of stuff.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/handle-it">If You Know How To Handle It, Handle It</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/use-structures">If Your Data Has a Schema, Use a Structure</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Debuggers Are Overrated</h1> |
||||
<span class="post-date"> |
||||
2019-07-08 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/debuggers/">#debuggers</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/debugging/">#debugging</a> |
||||
|
||||
</span> |
||||
<p>I heard a lot of people complaining that code editors are bad 'cause it's hard |
||||
to attach a debugger. I'd claim that this vision is wrong.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>But let's take a thing out of the way beforehand: I'm not saying debuggers are |
||||
<em>bad</em> you should never use them. Debuggers have their use, but every time I |
||||
had to use one, it was because there was something missing.</p> |
||||
<p>Most recently, using a framework in Java, I had problems with my code. I'd |
||||
expect it <a href="/books/things-i-learnt/crash-it">to crash</a> 'cause I didn't handle |
||||
things. What actually happened is that the framework silently hid the error |
||||
and restarted the processing. To find out what was happening, I had to attach |
||||
a debugger and see what was wrong with the data; otherwise, I'd have no idea |
||||
about what's wrong.</p> |
||||
<p>Was a debugger necessary there? I don't think so. If the framework actually |
||||
displayed the error (crashed, put a wall of text on the logs, whatever), I |
||||
wouldn't need to use a debugger. But, because something was missing, I did, |
||||
in fact, was <em>forced</em> to use a debugger.</p> |
||||
<p>Besides this, in the long run, you'd end up with problems in locations that |
||||
you can't attach a debugger -- for example, your production environment. You |
||||
<em>could</em> but you <em>shouldn't</em> do this. On the other hand, if you <a href="/books/things-i-learnt/log-events">log |
||||
events</a>, then you can see what was going |
||||
on, without a debugger.</p> |
||||
<p>Again, I'm not taking the merits of debuggers, but in the long run, they are |
||||
mostly useless and actually point missing surrounding support to actually |
||||
understand what's going on.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/understand-shortcuts">Shortcuts Are Nice, But Only In The Short Run</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/users">Think About The Users</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Disclaimer</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/disclaimer/">#disclaimer</a> |
||||
|
||||
</span> |
||||
<p>There is one magical thing you need to know when reading this book: It's all |
||||
personal opinion</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A lot of stuff I'm going to discuss throughout this book will come directly |
||||
from my personal experience in several projects -- system applications, web |
||||
backend, embedded, mobile, stream processing -- in several different languages |
||||
-- C, C++, Python, Java, Clojure, Rust. And, because it comes from personal |
||||
experience, everything reflects my own personal opinion on several subjects.</p> |
||||
<p>Obviously, you don't need to agree with every single point. But I hope at |
||||
least it will make you rethink a few subjects.</p> |
||||
<p>Also, sometimes I may mention some examples that people who know me -- either |
||||
worked with me, heard me complain about some project, inherit one of my |
||||
projects, <em>I</em> inherit one of the <em>their</em> projects -- may recognized and think |
||||
I'm attacking the author.</p> |
||||
<p>I am not.</p> |
||||
<p>We do mistakes. Sometimes we don't know the topic with are attacking, |
||||
sometimes we don't have full specs, sometimes we don't have the time to write |
||||
things properly in a crunchtime. And that's why some things don't look as |
||||
pretty as they should. Heck, if you think I'm attacking the original author of |
||||
some example, look back the stuff I wrote and you'll see things a lot worse.</p> |
||||
<p>But I need the example. I have this hope that showing people a few mistakes |
||||
can make things better. I want to show people how my opinion built over |
||||
some subject. And, again, I'm in no way attacking the original author of the |
||||
code. I may even call the code "stupid", but I'm not calling the author |
||||
<em>stupid</em>.</p> |
||||
<p>With that in mind...</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/intro">Intro</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/spec-first">Spec First, The Code</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - If A Function Description Includes An "And", It's Wrong</h1> |
||||
<span class="post-date"> |
||||
2019-06-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/documentation/">#documentation</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/single-responsibility/">#single responsibility</a> |
||||
|
||||
</span> |
||||
<p>Functions should do one thing and one thing only. I clear indication that |
||||
you're breaking this principle is the need to add an "and" in its |
||||
documentation.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>This is kind like "sometimes rule", but most of the time, when you feel you |
||||
need to add an "and" to the function documentation (its |
||||
<a href="/books/things-i-learnt/document-is-contract">contract</a>), then you're telling |
||||
that that function is doing two (or more) things.</p> |
||||
<p>One of guiding principles of good code is the <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle">Single responsibility |
||||
principle</a>, in |
||||
which each module/class/function should do one thing and one thing only. And, |
||||
again, if you're saying that a function is doing "this" <em>and</em> "that", you can |
||||
be sure it's not doing just <em>one</em> thing.</p> |
||||
<p>Ok, but what now? Well, you have two functions, with two distinct contracts. |
||||
Ok, but you <em>had</em> those two being called, what happens now? Well, where you |
||||
called one, you now will need to call two. If your preferred language have |
||||
support for function composition, you can use that to group both functions |
||||
again. This is the kind of stuff that you'll get when you <a href="/books/things-i-learnt/functional-programming">learn to use |
||||
functional programming</a>.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/document-is-contract">The Function Documentation Is Its Contract</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/languages-docs">Good Languages Come With Integrated Documentation</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,118 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - The Function Documentation Is Its Contract</h1> |
||||
<span class="post-date"> |
||||
2019-06-21 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/documentation/">#documentation</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/contracts/">#contracts</a> |
||||
|
||||
</span> |
||||
<p>When you start the code by <a href="/books/things-i-learnt/steps-as-comments">writing the general flow as |
||||
steps</a> and making each step a |
||||
function, you're actually making a contract (probably with your future self): |
||||
I'm saying this function does <em>this</em> and <em>this</em> is what it does.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Remember that the documentation must be a clear explanation of what your code |
||||
<em>is</em> doing and <em>why</em> it exists; remember that good messages will make <a href="/books/things-i-learnt/document-id">reading |
||||
the code only by the function documentation</a> |
||||
should be clear.</p> |
||||
<p>A function called <code>mult</code>, documented as "Get the value and multiply by 2" but, |
||||
when you look at the code, it does multiply by 2, but also sends the result |
||||
through the network or even just asks a remote service to multiply the |
||||
incoming result by 2, is clearly breaking its contract. It's not just |
||||
multiplying by 2, it's doing more than just that, or it's asking someone else |
||||
to manipulate the value.</p> |
||||
<p>Now, what happens when this kind of thing happens?</p> |
||||
<p>The easy solution is to change the documentation. But do you know if people |
||||
who called the function expecting it to be "multiply value by 2" will be happy |
||||
for it to call an external service? There is a clear breach of "contract" -- |
||||
whatever you initially said your function would do -- so the correct solution |
||||
would be to add a new function with a proper contract -- and probably a better |
||||
name.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/document-it">Documentation Is a Love Letter To Your Future Self</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/document-and">If A Function Description Includes An And, It's Wrong</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Documentation Is a Love Letter To Your Future Self</h1> |
||||
<span class="post-date"> |
||||
2019-06-21 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/documentation/">#documentation</a> |
||||
|
||||
</span> |
||||
<p>We all know writing the damn docs for functions and classes and modules is a |
||||
pain in the backside. But realizing what you were thinking when you wrote the |
||||
function will save your butt in the future.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>When I say that it will save your butt, I don't mean the documentation will |
||||
tell you something like "Here are the lotto numbers in 2027"<sup class="footnote-reference"><a href="#1">1</a></sup> or "If John |
||||
complains about your future code review, here is some shit he did in the |
||||
past".</p> |
||||
<p>I mean, it will explain how the <em>flow</em> of your code is expected to do. Imaging |
||||
this: pick your code and replace every function call to its documentation. Can |
||||
you understand what it is expected by reading that? If you can, |
||||
congratulations, you won't have a problem in the future; if you can't... well, |
||||
I have some bad news for you...</p> |
||||
<p>One point that may come here is "Code is its own documentation" or |
||||
"self-documenting code". I do understand, and yes, simpler functions may make |
||||
the documentation redundant (for example, if you notice that you need a |
||||
function that multiplies two numbers -- and only do that -- giving it a |
||||
description of "Multiples two numbers" may look redundant), but you have to |
||||
ask yourself <em>why</em> you needed such simple function. <em>Why</em> it exists? <em>Where</em> |
||||
it sits in the general data flow?</p> |
||||
<p>Another thing you can document: rarely used functions. One example is Java |
||||
Collectors: In Java, you can create a stream of data, which you can apply |
||||
transformations and such and, in the end, you may put the resulting collection |
||||
of data into another structure -- a list, for example. The thing is, |
||||
collecting to a list is pretty common, but collecting into a map, with a |
||||
function as key and another value as value, splitting the result into two |
||||
different data blocks, is not that common. Because it is uncommon to see such |
||||
collector, it is a good idea to add tips on what each option is.</p> |
||||
<p>That's the things you need to document.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Please, don't make me revise this in 2027... :(</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/languages-tests">Good Languages Come With Tests</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/document-is-contract">The Function Documentation Is Its Contract</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable</h1> |
||||
<span class="post-date"> |
||||
2019-07-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/microaggressions/">#microaggressions</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/toxic-people/">#toxic people</a> |
||||
|
||||
</span> |
||||
<p>You may think "But I could go to those people and say 'Why are you being |
||||
toxic?' or 'Why are you attacking me?' or even just tell them it's not nice to |
||||
say such things. It would help."</p> |
||||
<p>I don't believe that's the case.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>In the case of toxic people, they just want to see the place burn so they can |
||||
be the hero that saves the day. Microaggressors just want to make your feel |
||||
down 'cause so they could feel superior to you.</p> |
||||
<p>And I don't think they can be easily fixable. That's their modus operandi and |
||||
they will keep doing it so 'cause that's the only way they can see to |
||||
"improve" themselves -- even if there is no real improvement, they are just |
||||
letting everything down so they seem better than the others.</p> |
||||
<p>On the other hand, if you keep <a href="/books/things-i-learnt/watch-reactions">paying attention to the way people react to |
||||
you</a>, you may notice that you may be |
||||
doing this to others. And now the ball is in your park: Do you want to be a |
||||
better person or not?</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/microaggressions">Beware of Microaggressions</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/quit">Realize When It's Time To Quit</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,142 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Learn The Basics of Functional Programming</h1> |
||||
<span class="post-date"> |
||||
2019-06-26 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/functional-programming/">#functional programming</a> |
||||
|
||||
</span> |
||||
<p>At this point, you should at least have heard about how cool functional |
||||
programming is. There are a lot of concepts here, but at least the very basic |
||||
ones you should keep in mind.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A lot of talks about functional programming come with weird words like |
||||
"functors" and "monads". It doesn't hurt to know what they really mean |
||||
(disclaimer: I still don't). But some other stuff coming from functional |
||||
programming is actually easy to understand and grasp.</p> |
||||
<p>For example, immutability. This means that all your data can't change once |
||||
it's created. Do you have a record with user information and the user changed |
||||
their password? No, do not change the password field, create a new user record |
||||
with the updated password and discard the old one. Sure, it does a lot of |
||||
"create and destroy" sequences which makes absolutely no sense (why would you |
||||
allocate memory for a new user, copy everything from the old one to the new |
||||
one, update one field, and "deallocate" the memory from the old one? It makes |
||||
no sense!) but, in the long run, it would prevent weird results, specially |
||||
when you understand and start use threads.</p> |
||||
<p>(Basically, you're avoiding a shared state -- the memory -- between parts of |
||||
your code.)</p> |
||||
<p>Another useful concept is pure functions. Pure functions are functions that, |
||||
called with the same parameters, always return the same result, no matter how |
||||
many times you call them. One example of a <em>non</em> pure function is <code>random()</code>: |
||||
each time you call <code>random()</code>, you get a different number<sup class="footnote-reference"><a href="#1">1</a></sup>. An example of a |
||||
pure function would be something like this in Python:</p> |
||||
<pre data-lang="python" style="background-color:#2b303b;color:#c0c5ce;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#b48ead;">def </span><span style="color:#8fa1b3;">mult</span><span>(</span><span style="color:#bf616a;">x</span><span>): |
||||
</span><span> </span><span style="color:#b48ead;">return </span><span>x * </span><span style="color:#d08770;">4 |
||||
</span></code></pre> |
||||
<p>No matter how many times you call <code>mult(2)</code>, it will always return 8. Another |
||||
example could be our immutable password change above: You could easily write a |
||||
function that receives a user record and returns a new user record with the |
||||
password changed. You could call with the same record over and over again and |
||||
it will always return the same resulting record.</p> |
||||
<p>Pure functions are useful 'cause they are, first most, easy to test.</p> |
||||
<p>Second, they are easy to chain, specially in a <a href="/books/things-i-learnt/data-flow">data |
||||
flow</a> design: Because they don't have an |
||||
internal state (which is the real reason they are called pure functions), you |
||||
can easily call one after the other and no matter how many times you pass |
||||
things around, they still produce the same result. And because each function, |
||||
given the same input, produce the same result, chaining them all <em>also</em> |
||||
produces the same result given the same inputs.</p> |
||||
<p>Just those two concepts can make code longer (again, you're creating a new |
||||
user record instead of simply changing one field), but the final result is a |
||||
more robust code.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Except in Haskell, but it does require sending the seed every time, so |
||||
you end up with random values based on the seed, so even there it is a pure |
||||
function.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/cognitive-cost">Cognitive Cost Is The Readability Killer</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/understand-shortcuts">Shortcuts Are Nice, But Only In The Short Run</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Future Thinking is Future Trashing</h1> |
||||
<span class="post-date"> |
||||
2019-06-21 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/design/">#design</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/solution/">#solution</a> |
||||
|
||||
</span> |
||||
<p>When developers try to solve a problem, they sometimes try to find a way that |
||||
will solve all the problems, including the ones that may appear in the future.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Trying to solve the problems that will appear in the future comes with a hefty |
||||
tax: future problems future will never come -- and, believe me, they will |
||||
<em>never</em> come -- and you'll end up either having to maintain a huge behemoth of |
||||
code that will never be fully used or you'll end up rewriting the whole thing |
||||
'cause there is a shitton of unused stuff.</p> |
||||
<p>Solve the problem you have right now. Then solve the next one. And the next |
||||
one. At one point, you'll realize there is a pattern emerging from those |
||||
solutions and <em>then</em> you'll find your "solve everything". This pattern is the |
||||
<em>abstraction</em> you're looking for and <em>then</em> you'll be able to solve it in a |
||||
simple way.</p> |
||||
<p>As Steve Jobs once said "You can't connect the dots looking forward, only |
||||
backwards".</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/throw-away">Be Ready To Throw Your Code Away</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/boolean-parameters">Don't Use Booleans As Parameters</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Gerrit Is A Mistake</h1> |
||||
<span class="post-date"> |
||||
2019-07-29 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/git/">#git</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/gerrit/">#gerrit</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/source-control/">#source control</a> |
||||
|
||||
</span> |
||||
<p>I hate calling software "a mistake", but I can't find any other way to |
||||
describe Gerrit. You may see people using Gerrit 'cause Google uses it. The |
||||
thing is: Google misunderstood what Git actually is.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>When Linus Torvalds came with Git, he was trying to mimic another system, |
||||
BitKeeper. Along with some improvements over CVS and SubVersion, Git made |
||||
really easy to create and merge branches, something that was either |
||||
almost-not-supported or slow-as-heck, depending on which tool you look at.</p> |
||||
<p>You need to take this into consideration: Git made branches easy.</p> |
||||
<p>Then someone came with the idea of Gerrit: Instead of managing branches, it |
||||
actually manages <em>commits</em>. Instead of having a branch for each feature, you |
||||
should have <em>one single commit</em> as feature. You can have branches on your |
||||
machine, but the server only deal with commits.</p> |
||||
<p>So Gerrit took Git, a tool that improved the way we deal with branches, and |
||||
removed branches. This is akin to taking a text editor and taking away the |
||||
ability to <em>edit text</em>. Does that sound right to you?</p> |
||||
<p>In my personal opinion, what they did was to take git apart and put an err in |
||||
the middle: gERRit.</p> |
||||
<p>When I see someone using Gerrit, I know something is wrong there.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/one-change-commit">One Commit Per Change</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/git-flow">Git-Flow Is The Way To Go</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,133 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Gherkin Is Your Friend to Understand Expectations</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/book/">#book</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/gherkin/">#gherkin</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/expectations/">#expectations</a> |
||||
|
||||
</span> |
||||
<p>Gherkin is file format for writing behaviour tests (BDD). But it can also give |
||||
you some insights on what you should do.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Alright, let's talk a bit about Gherkin:</p> |
||||
<p><a href="https://en.wikipedia.org/wiki/Cucumber_(software)#Gherkin_language">Gherkin</a> |
||||
is a file format created for <a href="https://en.wikipedia.org/wiki/Cucumber_(software)">Cucumber</a>, |
||||
which describes scenarios, what's in them, what actions the user/system will |
||||
do and what's expected after those actions, in a very high level, allowing |
||||
people without programming experience can describe what's expected from the |
||||
system.</p> |
||||
<p>Although Gherkin was born with Cucumber, it is now supported by a bunch of |
||||
programming languages, through external libraries.</p> |
||||
<p>A typical Gherkin file may look something like this:</p> |
||||
<ul> |
||||
<li><strong>Given that</strong> <em>initial system environment</em></li> |
||||
<li><strong>When</strong> <em>action performed by the user or some external system</em></li> |
||||
<li><strong>Then</strong> <em>expected system environment</em></li> |
||||
</ul> |
||||
<p>Or, in a more concrete example:</p> |
||||
<ul> |
||||
<li><strong>Given that</strong> The system is retrieving all tweets liked by the user</li> |
||||
<li><strong>When</strong> It finds a tweet with an attachment</li> |
||||
<li><strong>Then</strong> The attachment should be saved along the tweet text</li> |
||||
</ul> |
||||
<p>Pretty simple, right?</p> |
||||
<p>Now, why I'm mentioning this?</p> |
||||
<p>Sometimes, specs are not the most clear source of information about what it is |
||||
expected from the system, and up can't think of <a href="/books/things-i-learnt/steps-as-comments">steps to do |
||||
so</a>. If you're confused about what |
||||
you should write, asking the person responsible for the request to write |
||||
something like Gherkin may give you some better insights about it.</p> |
||||
<p>Obviously, it won't be complete. People tend to forget the error situations -- |
||||
like filling the name field with numbers, using characters in age fields, |
||||
tweets with no text and just attachments -- but at least with a Gherkin |
||||
description of the system, you can get a better picture of the whole.</p> |
||||
<p>Also, you may not like to write specs. That's alright, you can replace them |
||||
with Gherkin anyway.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/steps-as-comments">Write Steps as Comments</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/patterns-not-solutions">Design Patters Are Used to Name Solution, Not Find Them</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Git-Flow Is The Way To Go</h1> |
||||
<span class="post-date"> |
||||
2019-07-30 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/git/">#git</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/git-flow/">#git flow</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/source-control/">#source control</a> |
||||
|
||||
</span> |
||||
<p>If <a href="/books/thing-i-learnt/gerrit">Gerrit is such a mistake</a>, what can you use |
||||
instead? Git Flow!</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Git Flow is a plugin for Git for managing branches. It is based on the concept |
||||
of "feature branches", in which each branch is a feature or bug you're working |
||||
on. Once you finish it, it will just close the branch.</p> |
||||
<p>Although there is a lot to be said about Git and how you should use it, the |
||||
fact is that Git Flow manages a lot of complexity of having a stable branch, |
||||
an "unstable"/testing branch and all features around those.</p> |
||||
<p>Not only that, but with the current source control sites like Github and |
||||
GitLab, the flow is quite similar -- although working with branches is changed |
||||
with forks.</p> |
||||
<p>You can even install Git Flow and use it on your personal project -- which is |
||||
something I do with this blog/book!</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/gerrit">Gerrit Is A Mistake</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/project-organization">Organize Your Code by Data/Type, Not Functionality</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style</h1> |
||||
<span class="post-date"> |
||||
2019-07-16 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code-style/">#code style</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/google-code-style/">#google code style</a> |
||||
|
||||
</span> |
||||
<p>Every freaking time Google comes with their own coding style, it's a garbage |
||||
fire. The community came with a better style way before and Google seem to |
||||
come with a style with high contrasting parts just to call it theirs.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>The only reason to use Google Code Style is in case someone less smart than |
||||
you decided it would be a good idea to use it. Then, I feel sorry for you, but |
||||
you'll have to follow Google Code Style.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/code-style">Code Style: Follow It</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/hero-projects">Hero Projects: You'll Have To Do It Yourself</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - If You Know How To Handle It, Handle It</h1> |
||||
<span class="post-date"> |
||||
2019-06-24 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/exceptions/">#exceptions</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/error-handling/">#error handling</a> |
||||
|
||||
</span> |
||||
<p>If you know an error can occur, then you should handle it properly, instead of |
||||
ignoring it.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>This is the opposite point of <a href="/books/things-i-learnt/crash-it">let it crash</a>: |
||||
You're writing some code that you <em>know</em> it can crash in a certain way, what |
||||
should you do? Well, the answer is simple: <em>handle</em> it, not <em>ignore</em> it.</p> |
||||
<p>If we go back to the fact that Java will describe every single exception that |
||||
can be thrown by a function, you should handle each exception, no excuses.</p> |
||||
<p>If you're using Python, then you should capture the exceptions you know how to |
||||
handle, no exceptions -- and tying with the previous point, if you don't know |
||||
how to handle them, you should not capture them in the first place.</p> |
||||
<p>But, no matter what language you're using, if you know an error/exception can |
||||
occur, <em>deal with it</em>. If you have to save the content of the user somewhere |
||||
else, log it to be reprocessed later or even just show an error message, do |
||||
it.</p> |
||||
<p>Although I seriously meant it, it doesn't mean you have to remember every |
||||
single exception/error code and what it means when calling a function. You can |
||||
write code that will actually go through the happy path and later fill the |
||||
blanks. Or even, when you're working on another part of the code, if you |
||||
remember another problem, just write on a post-it and add the handling later. |
||||
The important bit is not to forget to handle it.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/crash-it">It's Better To Let The Application Crash Than Do Nothing</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/data-types">Types Say What You Data Is</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,113 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - ... Unless That Code Style Is The Google Code Style</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/community/">#community</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/teams/">#teams</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/hero-project/">#hero project</a> |
||||
|
||||
</span> |
||||
<p>An "hero project" is a project/spec change that you personally think will |
||||
solve a group of problems in your project. It could be a different |
||||
architecture, a new framework or even a new language.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Hero projects happen mostly when a single developer wants to prove something |
||||
without the support of the company or even the time they are in.</p> |
||||
<p>On those projects, developers will spend their free time to write a |
||||
proof-of-concept, just to prove a point.</p> |
||||
<p>And, sometimes, it just proves that they are were wrong.</p> |
||||
<p>(Although that last point sounds a bit sad, if you have to do an hero project, |
||||
you'll still learn something new and, maybe, even add a new bullet point to |
||||
your CV.)</p> |
||||
<p>Just to be clear: Sometimes an hero project will fail <a href="/books/things-i-learnt/right-tool-obvious">because the answer is |
||||
obvious</a>. Don't let that make you |
||||
feel down.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/google-code-style">... Unless That Code Style Is The Google Code Style</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/team-discussion">Global Changes Must Be Discussed With The Whole Team First</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Don't Confuse Hero Project With Hero Syndrome</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/hero-syndrome/">#hero syndrome</a> |
||||
|
||||
</span> |
||||
<p>Someone that suffers from Hero Syndrome will claim that things won't work |
||||
unless they are carefully watching over everything.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I've seen this at least two times in my professional life. Usually, those |
||||
people are actually doing so much micromanaging that they are not other |
||||
realize when things are in trouble.</p> |
||||
<p>I've even seen someone doing a poor job on <em>their job</em>, so things would break |
||||
and then start calling people out that he had to fix it 'cause nobody would.</p> |
||||
<p>Don't do that.</p> |
||||
<p>I know you can get frustrated when you're the only one realizing things are |
||||
breaking apart, but you can add some |
||||
<a href="/books/things-i-learnt/monitoring">monitoring</a> to your project, asking your |
||||
manager to show your solution -- you can even mention it on your group/daily |
||||
stand up meeting -- and pointing out to people how to realize when your |
||||
project broke. Suddenly, people will realize how to monitor theirs too.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/watch-reactions">Pay Attention On How People React To You</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/toxic-people">Beware of Toxic People</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,43 @@
|
||||
<html> |
||||
<head> |
||||
<title>Zola</title> |
||||
</head> |
||||
<body> |
||||
<div class="container"> |
||||
<h1>Welcome to Zola!</h1> |
||||
<p> |
||||
You're seeing this page because we couldn't find a template to render. |
||||
</p> |
||||
<p> |
||||
To modify this page, create a <b>section.html</b> file in the templates directory or |
||||
<a href="https://www.getzola.org/documentation/themes/installing-and-using-themes/" target="_blank">install a theme</a>. |
||||
<br> |
||||
You can find what variables are available in this template in the <a href="https://www.getzola.org/documentation/templates/pages-sections/#section-variables" target="_blank">documentation</a>. |
||||
</p> |
||||
</div> |
||||
<footer> |
||||
<a href="https://www.getzola.org/documentation/getting-started/cli-usage/" target="_blank">Get started with Zola</a> |
||||
</footer> |
||||
<style> |
||||
html { |
||||
line-height: 1.5; |
||||
} |
||||
h1 { |
||||
margin-bottom: 2rem; |
||||
} |
||||
.container { |
||||
font-family: "sans-serif"; |
||||
text-align: center; |
||||
margin-top: 20vh; |
||||
padding: 2rem; |
||||
background: #e9e9e9; |
||||
} |
||||
footer { |
||||
position: fixed; |
||||
width: 100%; |
||||
bottom: 1rem; |
||||
text-align: center; |
||||
} |
||||
</style> |
||||
</body> |
||||
</html> |
@ -0,0 +1,155 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Unit Tests Are Good, Integration Tests Are Gooder</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/book/">#book</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/unit-tests/">#unit tests</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/integration-tests/">#integration tests</a> |
||||
|
||||
</span> |
||||
<p>The view of the whole is greater than the sum of its parts. And that includes |
||||
tests for the whole compared to tests of single things.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>First, I just don't want to into a discussion about what's the "unit in a unit |
||||
test"<sup class="footnote-reference"><a href="#1">1</a></sup>, so let's take the point that a unit test is a test that tests a |
||||
class/function, not the whole system from end to end, which would require data |
||||
flowing through several classes/functions.</p> |
||||
<p>There are several libraries/frameworks that actually split this in a way that |
||||
you can't test the whole. |
||||
<a href="https://spring.io/">Spring</a>+<a href="https://site.mockito.org/">Mockito</a> is one of |
||||
those combinations -- and one that I worked with. Due the bean container of |
||||
Java, the extensive use of Beans by Spring and the way Mockito interacts with |
||||
the container, it's pretty easy to write tests that involve only one class: |
||||
You can ask Mockito to mock every dependency injection (so it injects mocked |
||||
beans instead of the real ones) in one class and mock every injected class, |
||||
simply using annotations.</p> |
||||
<p>And this is cool and all and makes tests simple and fast. But the fact that we |
||||
are making sure each class does what it should do, it doesn't give a proper |
||||
view of the whole; you can't see if that collection of perfectly tested |
||||
classes actually solve the problem the system is responsible for solving.</p> |
||||
<p>Once, in C++, I wrote an alarm system |
||||
<a href="https://en.wikipedia.org/wiki/Daemon_(computing)">daemon</a> for switches. There |
||||
were three different levels of things the alarm system should do, depending on |
||||
the incoming message from a service: It could only log the message of the |
||||
incoming error, it could log the error and send a SNMP message, or it could |
||||
log the error, send a SNMP message and turn a LED in the front panel on. |
||||
Because each piece had a well defined functionality, we broke the system in |
||||
three different parts: One for the log, one for the SNMP and one for the LED. |
||||
All tested, all pretty. But I still had a nagging feeling that something was |
||||
missing. That's when I wrote a test that would bring the daemon up, send some |
||||
alarms and see the results.</p> |
||||
<p>And, although each module was well tested, we still got one things we were |
||||
doing it wrong. If we never wrote an integration test, we would never catch |
||||
those.</p> |
||||
<p>Not only that, but because we wrote a test that interacted with the daemon, we |
||||
could get a better picture of its functionality and the test actually <em>made |
||||
sense</em> -- as in, if you read the unit tests, they seemed disconnected from |
||||
what the daemon was expected to do, but the integration tests actually read |
||||
like "Here, let me show that we actually did what you asked". And yes, this |
||||
was akin to <a href="/books/things-i-learnt/gherkin">Gherkin</a> tests, although I didn't |
||||
know Gherkin at the time -- and, better yet, we had tests that proved that we |
||||
were following the <a href="/books/things-i-learnt/spec-first">spec</a>.</p> |
||||
<p>Personally, I think over time integration tests become more important than |
||||
unit tests. The reason is that I personally have the feeling<sup class="footnote-reference"><a href="#2">2</a></sup> that unit |
||||
tests check if the classes/functions have <em>adherence</em> to the underlying |
||||
<em>design</em> -- Does your view can actually work without the controller? Is the |
||||
controller using something from the model or using things that should be in |
||||
the view? -- but adherence to the design gets better over time -- developers |
||||
start using the layout from previous examples, so they capture the design by |
||||
osmosis, while the big picture starts to get more and more complex, with lots |
||||
of moving parts.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>There is no "unit" in "unit tests". "Unit test" means the test <em>is</em> a |
||||
unit, indivisible and dependent only on itself.</p> |
||||
</div> |
||||
<div class="footnote-definition" id="2"><sup class="footnote-definition-label">2</sup> |
||||
<p>Again, it's pure feeling from my experience. I have no data to back that |
||||
affirmation up, so take it with a grain of salt.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/users">Think About The Users</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/tests-dead-code">Testing Every Function Creates Dead Code</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Beware of Interface Changes</h1> |
||||
<span class="post-date"> |
||||
2019-06-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/interfaces/">#interfaces</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/apis/">#apis</a> |
||||
|
||||
</span> |
||||
<p>Interfaces and APIs is what you give away to others. If you keep changing them, |
||||
you'll make everyone's life sad.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>When talking about <a href="/books/things-i-learnt/boolean-parameters">boolean |
||||
parameters</a>, I mentioned about |
||||
renaming the function. If you control the whole source where the function is |
||||
used, that's not issue, it's just a matter of search and replace.</p> |
||||
<p>But if that function was actually exposed in a library, you shouldn't change |
||||
function names in a whim. That will break a lot of other applications beyond |
||||
your control and make a lot of other people unhappy.</p> |
||||
<p>Remember, when you write <a href="/books/things-i-learnt/tests-apis">tests for APIs</a>, |
||||
you can see these kind of changes happening and you can see the kind of |
||||
changes you're doing on how they reflect externally.</p> |
||||
<p>You can create the new functions and mark the current one as deprecated, |
||||
either by documentation or by some code feature. Then, after a few releases, |
||||
you can finally kill the original function.</p> |
||||
<p>(A dickish move you can do is to create the new functions, mark the current |
||||
function as deprecated and <em>add a sleep at the start of the function</em>, in a |
||||
way that people using the old function are forced to update.)</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/boolean-parameters">Don't Use Booleans As Parameters</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/crash-it">It's Better To Let The Application Crash Than Do Nothing</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,130 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Intro</h1> |
||||
<span class="post-date"> |
||||
2019-06-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/intro/">#intro</a> |
||||
|
||||
</span> |
||||
<p>"Things I Learnt The Hard Way (In 30 Years of Software Development)" started |
||||
as a simple sequence of toots (the same as "tweets", on |
||||
<a href="https://functional.cafe/@juliobiason">Mastodon</a> when I was thinking about a |
||||
new presentation I could do.</p> |
||||
<p>But why "a new presentation"?</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I go around my state with a group called |
||||
"<a href="https://tchelinux.org/">Tchelinux</a>": We usually go to universities and talk |
||||
to people starting uni, explaining things about free/libre software and |
||||
sometimes telling people about things they wouldn't normally see in the uni |
||||
curriculum.</p> |
||||
<p>One thing that annoys me is that there are very few presentations about "when |
||||
things go wrong". All the presentations show prototypes or tell the good |
||||
stuff, and hide all the wrong things that could happen<sup class="footnote-reference"><a href="#1">1</a></sup>. Obviously, after |
||||
working 30 years in the field of software development, I saw my fair share of |
||||
things going wrong -- sometimes in unimaginable piles of crap -- and I thought |
||||
"maybe that's something people would like to hear".</p> |
||||
<p>(And, to be completely honest, some of those piles of crap were my own fault.)</p> |
||||
<p>And that's when the toot sequence started. Just before I noticed, I spent the |
||||
whole day just posting this kind of stuff (fortunately, my pile of things in |
||||
the "incoming" folder was a bit empty at the time) and it had 30 points, plus |
||||
addenda and a few explanation points. That's when I decided to group all |
||||
them in a single post.</p> |
||||
<p>(Actually, I'm lying: Someone mentioned on Functional Café that I should make |
||||
a blog post for making it easier to read.)</p> |
||||
<p>All I thought when I grouped everything in a post was "this will make things |
||||
easier for the people following the thread on Mastodon". But then the post |
||||
appeared on Reddit. And Twitter. And HackerNews. And YCombinator. And none of |
||||
those where mine.</p> |
||||
<p>But here is the thing: Each point was limited by the toot size, which is 500 |
||||
characters. Sometimes that's not enough to expand the point, explain it |
||||
properly and add some examples.</p> |
||||
<p>And that's how the idea to write this "book" came to life.</p> |
||||
<p>One thing you must keep in mind here: <em>These are my options</em>. I understand |
||||
that not everything is so black and white as put here, and some people's |
||||
experiences may not match things here. Also, you get a bit cynical about |
||||
technology after 30 years. So... thread carefully, 'cause here be dragons.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Yup, I'm guilty of that too.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/disclaimer">Disclaimer</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,139 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - A Language Is Much More Than A Language</h1> |
||||
<span class="post-date"> |
||||
2019-06-24 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/languages/">#languages</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/community/">#community</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/ecosystem/">#ecosystem</a> |
||||
|
||||
</span> |
||||
<p>Picking a programming language is much more than just picking the words that |
||||
will generate a code. They come with a community, a leadership, an ecosystem |
||||
and a thread the binds them all together.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Programming languages, in essence, are simply a bunch of keywords that make |
||||
things "go". But besides those keywords, they also bring their community, the |
||||
way the leaders deal with the community, the tools created by the leaders or |
||||
community to deal with the minutiae of creating a system, the way those tools |
||||
interact with each other, and a lot more.</p> |
||||
<p>While a language may have a simple syntax, it may be that the ones controlling |
||||
the language actually don't give two shits -- if you pardon my French -- to |
||||
the community. They focus on solving <em>their</em> problems, not the community |
||||
problems<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>Or maybe the community has duplicate tools -- which is not a problem -- but |
||||
that developers of each tool don't talk to each other. Or worse: They simply |
||||
refuse to look what other tools are doing, which could be used to improve |
||||
their own<sup class="footnote-reference"><a href="#2">2</a></sup>.</p> |
||||
<p>And maybe that third language is not as simple as others, but the leadership |
||||
is always discussing things with the community, being transparent on their |
||||
decision, allowing the community to discuss the future of the language and |
||||
even different groups building tools decided to merge efforts to give the |
||||
community better tools.</p> |
||||
<p>That's why you can't "pick" a language by its syntax alone. That's only the |
||||
surface of what the whole of a language encapsulates and if you ignore the |
||||
other elements in it, you may find yourself with a cute language in a |
||||
community that is always fighting and never going forward.</p> |
||||
<p>And picking a language for something <em>above</em> the syntax is even worse.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Yes, this is common, even in larger communities. And yes, I've seen the |
||||
leadership ignoring requests from the community and, sometimes, just |
||||
ignoring all the hard work the community did to supply the missing bits |
||||
because they didn't like it. |
||||
<sup class="footnote-reference"><a href="#2">2</a></sup>: Again, I've seen this before: There was a language that didn't come with |
||||
a build tool bundled. The community created a tool, which was widely |
||||
adopted. Later, a new build tool appeared and, in one of the notes, the |
||||
author of the new tool mentioned a feature. The community came and asked |
||||
"The previous build tool did something like that, what's the difference |
||||
between that and your tool?" And the answer was "I never used the first |
||||
tool." So, basically, the community ignored whatever the community was |
||||
using.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/monitoring">Learn To Monitor</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/outside-project">Don't Mess With Things Outside Your Project</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,119 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Good Languages Come With Integrated Documentation</h1> |
||||
<span class="post-date"> |
||||
2019-06-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/languages/">#languages</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/documentation/">#documentation</a> |
||||
|
||||
</span> |
||||
<p>If you're worried about learning some new programming language, you can bet |
||||
the one with a better documentation is the one that is <em>born</em> with a document |
||||
processor.</p> |
||||
<p>Same goes for the frameworks/libraries of that language.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>The answer for that is the same as <a href="https://blog.juliobiason.me/books/things-i-learnt/languages-docs/languages-tests">languages that come with |
||||
tests</a>: because the programming language standard library |
||||
comes with a documentation generator or even because documentation is bundled |
||||
in the language itself, it reduces the friction needed to start writing the |
||||
documentation.</p> |
||||
<p>Python is a curious case that it came with a simple documentation generator |
||||
(PyDoc) and a bundled documentation format (DocStrings). Nowadays, almost |
||||
nobody is using the default documentation generator anymore, but because the |
||||
documentation format is still there and is still supported by the language |
||||
(documentation appears as a property of every function, class and module), |
||||
other tools took the post of default documentation generator, but the |
||||
documentation format is still heavy used.</p> |
||||
<p>Also, the opposite seems almost always true: If the language doesn't come with |
||||
integrated documentation, there is a very good chance that the documentation |
||||
or the language or frameworks and libraries will be bad. Or, in the very |
||||
least, every library will pick its own format, every framework will pick its |
||||
own format and they will never match the language format, and you'll end up |
||||
with a mess of a documentation to decipher.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/document-and">If A Function Description Includes An And, It's Wrong</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/always-vcs">Always Use A Version Control System</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Good Languages Come With Tests</h1> |
||||
<span class="post-date"> |
||||
2019-06-20 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/programming-languages/">#programming languages</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/tests/">#tests</a> |
||||
|
||||
</span> |
||||
<p>You can be sure that if a language brings a testing framework -- even minimal |
||||
-- in its standard library, the ecosystem around it will have better tests |
||||
than a language that doesn't carry a testing framework, no matter how good the |
||||
external testing frameworks for the language are.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>The reason is kinda obvious on this one: When the language itself brings a |
||||
testing framework, it reduces the friction for people to start writing tests, |
||||
and that includes the authors of the language itself and the community.</p> |
||||
<p>Sure, better frameworks may come along, and languages that don't have a |
||||
testing framework in their standard library may have options with better |
||||
support and easier access but, again, when they are there from the start, the |
||||
start is better and the final result is better.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/tests-in-the-command-line">Make Tests That You Know How To Run On The Command Line</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/document-it">Documentation Is A Love Letter To Your Future Self</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,116 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - You'll Learn About Yourself The Hard Way</h1> |
||||
<span class="post-date"> |
||||
2019-07-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/burn-out/">#burn out</a> |
||||
|
||||
</span> |
||||
<p>We get frustrated with code that doesn't compile. We get angry with customers |
||||
asking things back and forth. We get upset when upper management can't make up |
||||
its mind. And we lash out on others when that happens.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Unfortunately, that's the way you'll learn about yourself. You'll learn to |
||||
figure out when you get frustrated. You'll learn how you can keep getting |
||||
attacked by others -- even micro-aggressions -- but, without realizing, at |
||||
some point you'll suddenly burst into an counter-attack that may seem out of |
||||
proportion.</p> |
||||
<p>The worst part of it all? Very few people will tell you what you're doing |
||||
before it's too late -- you'll get in trouble way before you could actually |
||||
understand what you were doing.</p> |
||||
<p>But, again, you'll get in trouble.</p> |
||||
<p>And you <em>must</em> learn about these events. Take the feedback as true, even if |
||||
you don't agree with it. I had my falls, and I always took it as something I |
||||
need to improve, even if later I said to my psychologist that I thought it was |
||||
unfair and biased -- mostly 'cause I'm the quiet guy that always took the |
||||
blows and never complained about, and people taking the flak from me were more |
||||
vocal and friendlier to the higher-ups. But, again, I took it as true, and did |
||||
my best to work on those problems.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/people-care">You'll Learn About Yourself The Hard Way</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/watch-reactions">Pay Attention On How People React To You</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Create Libraries</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/libraries/">#libraries</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/project-organization/">#project organization</a> |
||||
|
||||
</span> |
||||
<p>One thing you must learn is how to break your project into smaller libraries, |
||||
to avoid doing rounds to deal with "the same, but a bit different".</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I've seen a lot of projects that use things like branches for different |
||||
things. Say, you have an e-commerce page. But you also have different clients, |
||||
and they all have different colours and logo. Some people would take this |
||||
scenario and, using the VCS properties, use the main branch for the main code |
||||
and a branch for each client, merge from main branch from time to time -- and, |
||||
thus, the branches are never merged back.</p> |
||||
<p>This is suboptimal, 'cause that's not how VCS are supposed to be used.</p> |
||||
<p>But you can, for example, break the main code into a library/framework and |
||||
have one project for each client, with their assets and you just reference the |
||||
library/framework in each.</p> |
||||
<p>Simple and clean.</p> |
||||
<p>But stop there for a second. Although this makes the code cleaner, avoids |
||||
duplication and uses a VCS in the way it was supposed to be used, you can't |
||||
start this way.</p> |
||||
<p>Remember that <a href="/books/things-i-learnt/future-trashing">future thinking is future |
||||
trashing</a>. What you can do is actually |
||||
break your project by functionality, <a href="/books/things-i-learnt/project-organization">making modules related to their |
||||
data</a> and then, when you get a |
||||
reasonable number of clients, you'll notice what can be reused in each, what |
||||
modules make sense for one client and not for another. And then you'll have a |
||||
good way to deal with those.</p> |
||||
<p>One project that may appear when creating libraries is "How do I create my own |
||||
library repository?" 'Cause all modern languages today have support for |
||||
importing external libraries and, even if your libraries will never be out of |
||||
your control, they are external to the project. So you may need to learn how |
||||
to deal with this before creating the libraries. And, unfortunately, each |
||||
language and build tool has its own way to manage this.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/project-organization">Organize Your Code by Data/Type, Not Functionality</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/paper-notes">Paper Notes Are Actually Helpful</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Logs Are For Events, Not User Interface</h1> |
||||
<span class="post-date"> |
||||
2019-07-01 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/logs/">#logs</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/ui/">#ui</a> |
||||
|
||||
</span> |
||||
<p>Two things in one: First of all, when using logging, use it to log events, not |
||||
for user interfaces; second, log <em>events</em> in a machine readable way, not |
||||
necessarily an human readable format.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>For a long time, I used logs to show to the user what was happening. To me, it |
||||
was logical to use something where I could mark errors as errors, general |
||||
information as information and, if the user requested more information, print |
||||
more information on what was going on. So I just added logging, defined normal |
||||
messages as <code>info</code>, errors as <code>errors</code>, information that may help me find |
||||
errors as <code>debug</code> and use <em>only</em> the logging system for all output of the |
||||
application.</p> |
||||
<p>But that's not what logs are targeted for -- and now I'm having to rethink |
||||
most of the stuff I already wrote.</p> |
||||
<p>Use the standard output to inform the user what's going on, in a human |
||||
readable format; use the standard error output to inform the user when things |
||||
go wrong; but use the logs to capture something that you'll have to process |
||||
later, so you should probably use a format that it is easier to parse, even if |
||||
it is not so friendly.</p> |
||||
<p>As an example, let's say you're connecting to a server. You could use the |
||||
standard output to say "Connecting to server", to give the user a feedback |
||||
about what's going on; at the same time, you could log "CONNECTION |
||||
[SERVER]", with the IP/Name of the server you're connecting. Surely, the |
||||
"CONNECTION" word is not that friendly to the user, but if you had to parse |
||||
the line, it would be really easy, wouldn't it?</p> |
||||
<p>Another example: If your application is adding a record to the database, there |
||||
is nothing wrong logging "ADDING_RECORD: field=value; field=value; |
||||
field=value" 'cause, in case something goes wrong while saving the record, you |
||||
could have the values to try to figure out why it failed -- surely, logging |
||||
why it failed also helps, but you know what I mean. This is an example of |
||||
something that makes complete sense in logs, but not in user interfaces.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/app-composition-stupid">Even for Application Composition, Start Stupid</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/transparent">Be Transparent With The User</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,172 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - The Magical Number Seven, Plus Or Minus Two</h1> |
||||
<span class="post-date"> |
||||
2019-06-26 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/complexity/">#complexity</a> |
||||
|
||||
</span> |
||||
<p>"<a href="https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two">The magical number</a>" |
||||
is a psychology article about the number of things one can keep in their mind |
||||
at the same time.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I've seen twice this weird construction on where a function would do some |
||||
processing, but its return value was the return of this processing, plus the |
||||
result of a second function and some bit of processing. Nothing major. But the |
||||
second function would also do some processing and call a third function. And |
||||
the third function would call a fourth. And the fourth a fifth. And the fifth, |
||||
a sixth function.</p> |
||||
<p>And the "processing" was not something small, like "add two" or "multiply by |
||||
itself or a configurable value".</p> |
||||
<p>Something like this</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>func_1 |
||||
</span><span> +-- func_2 |
||||
</span><span> +-- func_3 |
||||
</span><span> +-- func_4 |
||||
</span><span> +-- func_5 |
||||
</span><span> +-- func6 |
||||
</span></code></pre> |
||||
<p>(If you need the <em>real</em> processing I saw, it was a class that had a function |
||||
with some processing and then it would call a function in an injected |
||||
dependency -- which is pretty nice and dandy. But the injected dependency had |
||||
an injected dependency, and the third injected dependency <em>also</em> had an |
||||
injected dependency, and so forth).</p> |
||||
<p>Now, when you're trying to understand this kind of code to find a problem, |
||||
you'll have to keep in mind what the first, second, third, fourth, fifth and |
||||
sixth functions do, 'cause they are all calling each other (inside them).</p> |
||||
<p>This causes some serious mental overflow that shouldn't be necessary.</p> |
||||
<p>Not only that, but imagine that you put a log before and after <code>func_1</code>: The |
||||
log before points the data that's being send to <code>func_1</code>, and the log after |
||||
its result.</p> |
||||
<p>So you'd end up with the impression that <code>func_1</code> does a lot of stuff, when it |
||||
actually is passing the transformation along.</p> |
||||
<p>(I got a weird experience with a function called <code>expand</code>, which logging |
||||
before the call would show some raw, compressed data, but the after was not |
||||
the expanded data, but actually a list of already processed data from the |
||||
compressed data.)</p> |
||||
<p>What would be a better solution, you may ask?</p> |
||||
<p>Well, if instead of making <code>func_1</code> call <code>func_2</code>, you can make it return the |
||||
result (which may not be the final result, anyway) and <em>then</em> call <code>func_2</code> |
||||
with that result.</p> |
||||
<p>Something like:</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>result1 = func_1 |
||||
</span><span>result2 = func_2(result1) |
||||
</span><span>result3 = func_3(result2) |
||||
</span><span>result4 = func_4(result3) |
||||
</span><span>result5 = func_5(result4) |
||||
</span><span>result6 = func_6(result5) |
||||
</span><span>result7 = func_7(result6) |
||||
</span></code></pre> |
||||
<p>(If we go back to the dependency injection chain, you may think that instead |
||||
of making DI7 receive DI6 as dependency [which would receive DI5 as |
||||
dependency, which would receive DI4 as dependency, which would receive DI3 as |
||||
dependency and so forth] you would actually create all the DI (dependency |
||||
injections) in one single pass and then the starting function would call the |
||||
dependencies in a single shot, not chaining them.)</p> |
||||
<p>Now you can see <em>exactly</em> how the data is being transformed -- and, obviously, |
||||
the functions would have better names, like <code>expand</code>, <code>break_lines</code>, |
||||
<code>name_fields</code> and so on, so you can see that that compressed data I mentioned |
||||
before is actually being decompressed, the content is being broke line by |
||||
line, the lines are getting names in its fields and so on (and one could even |
||||
claim that it would make things clear if there was a function after |
||||
<code>break_lines</code> which would just <code>break_fields</code>, which would make <code>name_fields</code> |
||||
more obvious -- and in a construction like this it would be almost trivial to |
||||
add this additional step).</p> |
||||
<p>"But that isn't performant!" someone may cry. Well, maybe it's just a bit less |
||||
performant than the original chained-calls ('cause it wouldn't create and |
||||
destroy frames in the stack, it would just pile them up and then "unstack" them |
||||
all in the end), but heck, optimization is for compilers, not people. Your job |
||||
is to make the code <em>readable</em> and <em>understandable</em>. If you need performance, |
||||
you can think of a better sequence of steps, not some "let's make this a mess |
||||
to read" solution.</p> |
||||
<p>Just a quick note: Although the famous paper mentions that the number is |
||||
around 7, new research is actually pointing that the number is way lower than |
||||
that, at 4. So simply making <code>func_1</code> call <code>func_2</code>, which would call |
||||
<code>func_3</code>, which would call <code>func_4</code> may be enough to overload someone and make |
||||
them lose the track of what the code does.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/data-flow">The Magic Number Seven, Plus Or Minus Two</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/cognitive-cost">Cognitive Cost Is The Readability Killer</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,135 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Beware of Microaggressions</h1> |
||||
<span class="post-date"> |
||||
2019-07-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/microaggressions/">#microaggressions</a> |
||||
|
||||
</span> |
||||
<p>Microaggressions are defined as "brief, everyday exchanges that send |
||||
denigrating messages to certain individuals because of their group |
||||
membership". The hardest part is that they don't sound aggressive.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Although I'm not part of an oppressed group, I've been microattacked more than |
||||
once, by the same person.</p> |
||||
<p>At some point, he mentioned that one couldn't talk bad about someone "around |
||||
some people". That "someone" was a politician that got arrested for, |
||||
basically, stealing from the country to promote a certain other company. The |
||||
way that person said it, thought, made it seem I felt it was wrong to arrest |
||||
the politician.</p> |
||||
<p>Another time, I was casually saying that I shouldn't have come to work on my |
||||
motorbike, although three forecast apps said it wouldn't rain. His comment: "I |
||||
just looked outside".</p> |
||||
<p>It may seem innocuous reading those, but if you look closely, all he was |
||||
trying to do was do let me down. Oh no, I'm part of a group that thinks |
||||
politicians shouldn't be arrested! Oh no, I'm not smart enough to look |
||||
outside, while he is<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>And those are really hard to fight, 'cause we aren't prepared to "get" those |
||||
as real attacks.</p> |
||||
<p>On top of that, HR people are not really prepared to understand those (it will |
||||
always fall into the "it was just a joke"<sup class="footnote-reference"><a href="#2">2</a></sup> excuse and you'll be the |
||||
troublemaker<sup class="footnote-reference"><a href="#3">3</a></sup>).</p> |
||||
<p>The worst part? While you don't fully get it as an attack, it will slowly pile |
||||
up. At some point, you may even burst into attacking the person back, with all |
||||
the concentrated attacks in a single moment. And them <em>you</em> will be seen as |
||||
aggressive, not them.</p> |
||||
<p>Better just stay away and avoid contact if possible.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>In the end, when I had to leave work to go back home, it wasn't raining.</p> |
||||
</div> |
||||
<div class="footnote-definition" id="2"><sup class="footnote-definition-label">2</sup> |
||||
<p>... which is the pure definition of "Schoddinger's Asshole": Someone |
||||
that make a comment and, by the other people reaction, call it a joke as a |
||||
"get out of jail" card.</p> |
||||
</div> |
||||
<div class="footnote-definition" id="3"><sup class="footnote-definition-label">3</sup> |
||||
<p>And I do wish you have a HR department that understand microaggressions.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/toxic-people">Beware of Toxic People</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/fixable">Toxic/Aggressive People Are Fixable</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Logs Are For Events, Not User Interface</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/monitoring/">#monitoring</a> |
||||
|
||||
</span> |
||||
<p>On a previous life, to understand how a system behaved, I added a ton of |
||||
metrics: how fast things were going in, how fast things were going out, how |
||||
many things were in the middle, how many the job processed... Not doing it so |
||||
makes me feel... naked.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Monitoring your project performance give you a really good view of how a |
||||
system is behaving. Is the speed going down? Is the system taking longer to |
||||
process an input? Are no inputs being processed?</p> |
||||
<p>If you have this kind of information, you can check what is going on in the |
||||
system and understand why. Is it normal? Did a change around the system (the |
||||
other system that produces the input, the system that consumes in the output) |
||||
affected the results?</p> |
||||
<p>If you're not measuring, you'll have no idea.</p> |
||||
<p>Also, "If you can not measure it, you can not improve it", as Lord Kevin said.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/add-then-remove">One Version To Add, One Version To Remove</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/languages-are-more">A Language Is Much More Than A Language</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Don't Tell It's Done When It's Not</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/responsibility/">#responsibility</a> |
||||
|
||||
</span> |
||||
<p>You are tired of running the same thing over and over again. You kinda |
||||
remember that something weird may happen, but because you're tired, you tell |
||||
everyone that "It's finished". Don't.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I must admit that I've done this. Yes, there is that corner case that I didn't |
||||
test. Yes, there is that piece of code that, although it works, it's weird. |
||||
Yes, I left a technical debt behind. But we get tired of looking at the same |
||||
thing over and over. And we get pushed by higher ups to deliver stuff. And |
||||
that's when we say "It's done", when it's not.</p> |
||||
<p>Although we just dodged one, we end up leaving our colleagues -- people that |
||||
really depend on our work -- down. They expect to connect to whatever we are |
||||
doing to keep going. The expect to see the results of their work crystallized |
||||
by ours. And they can't. 'Cause we said "It's done" when it wasn't.</p> |
||||
<p>And you can be sure, as soon as that happens, they will be the first to point, |
||||
in minutes, that it is not done.</p> |
||||
<p>On the other hand, if you say "Almost, but there is this thing that bothers me |
||||
and I think it may give us a headache in the future", they will understand. So |
||||
be clear and transparent about your work.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/responsible-code">Take Responsibility For The Use Of Your Code</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/people-care">People Get Upset About Code And Architecture Quality 'Cause They Care</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,121 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - One Commit Per Change</h1> |
||||
<span class="post-date"> |
||||
2019-07-09 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/source-control/">#source control</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/commits/">#commits</a> |
||||
|
||||
</span> |
||||
<p>When working with source control tools, keep one change per commit. Avoid |
||||
bundling more than one change in a single commit just to "save time".</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I've seen my fair share of commits with messages like "Fix issues #1, #2 |
||||
and #3". This is not something you should do. One commit for fixing issue #1, |
||||
another for #2 and yet another for #3.</p> |
||||
<p>Just note that I said "one commit per change", not "one commit per file". |
||||
Sometimes, to make a single change, you may need to change more than one file |
||||
-- it may point that you have a coupling problem, but that's a different |
||||
issue. You could, for example, make one commit which adds a new field in model |
||||
without adding a change in the controller to load this field; after all, the |
||||
controller won't (or, at least, shouldn't) break due the added field, and the |
||||
model won't break (or, at least, shouldn't) break because the controller is |
||||
not touching the field<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>When making a commit, think this: "In case something goes wrong, can I undo |
||||
this commit without breaking other stuff?" Commit history is stacked, so |
||||
obviously you'd have to undo the commits on top of that one. And that's |
||||
alright.</p> |
||||
<p><strong>BONUS TIP</strong>! If you're using <code>git</code>, you can use <code>git add -p</code> in case you |
||||
"overchange". It will allow you to pick parts of a file, instead of adding all |
||||
the changes in the file before committing.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Ok, it <em>may</em> have some issues if the field can't be null, but you get |
||||
what I meant, right?</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/always-vcs">Always Use A Version Control System</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnr/gerrit">Gerrit Is A Mistake</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Optimization Is For Compilers</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/optimization/">#optimization</a> |
||||
|
||||
</span> |
||||
<p>Let say you need more performance on your application. You may be tempted to |
||||
look at your code and think "How can I keep this same logic and still remove a |
||||
few cycles, so things seem to go faster?" Well, if you want performance, you |
||||
need to change your logic.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>But before jumping into the code, you may have to check your compiler options. |
||||
Maybe you're not generating the optimized version. Maybe there is an option |
||||
that you don't use that you can remove from the compilation.</p> |
||||
<p>'Cause "optimization" is what a compiler is for. They <em>know</em> where they can |
||||
extract most of the underlying architecture, and people have been finding ways |
||||
to make the compiled code more performance for decades. Heck, compilers can |
||||
even <em>delete</em> parts of your code 'cause they can "see" that a piece of code |
||||
will always produce the same result and, thus, isn't necessary and they will |
||||
just put the same result where that piece of code was.</p> |
||||
<p>What you need to do is to think about a better <em>design</em> for your code, not how |
||||
to improve the current code. And trying to trick the compiler by <a href="/books/things-i-learnt/data-types">messing with |
||||
the types</a>, although may produce faster |
||||
code, will really screw you in the future -- specially cause maintenance and |
||||
code understanding will take long and figuring out what went wrong will always |
||||
be harder.</p> |
||||
<p>Code is written for humans to read. <em>ALWAYS</em>. Optimization is what compilers |
||||
do. So find a smarter way to explain what you're trying to do instead of using |
||||
shorter words or messing with that your code is saying.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/use-utf8">Always Use UTF-8 For Your Strings</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/units">Units Makes Things Clear</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,121 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Don't Mess With Things Outside Your Project</h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/frameworks/">#frameworks</a> |
||||
|
||||
</span> |
||||
<p>Simple rule: Is the code yours or from your team? Good, you can make any |
||||
changes you want. Does it come from outside? DON'T. TOUCH. IT.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Sometimes people are tempted to, instead of using the proper extension tools, |
||||
change external libraries/frameworks -- for example, making changes directly |
||||
into WordPress or Django. Believe me, I've seen my fair share of this kind of |
||||
stuff going around.</p> |
||||
<p>This is an easy way to make the project -- the team project, that is -- |
||||
a huge security problem. As soon as a new version is released, you'll -- or, |
||||
better yet, someone who was not the person who decided to mess with outside |
||||
code -- have to keep up your changes in sync with the main project and, pretty |
||||
soon, you'll find that the changes don't apply anymore and you'll leave the |
||||
external project in an old version, full of security bugs.</p> |
||||
<p>Not only you'd end up with something that may very soon put at risk your whole |
||||
infrastructure, you won't take any benefits from things in the new versions, |
||||
'cause hey, you're stuck in the broken version!</p> |
||||
<p>Sometimes doing it so is faster and cheaper, and if you would do the same |
||||
thing using extensions or actually coding around the problem, even duplicating |
||||
the framework functions, would probably take longer and make you write more |
||||
code, but in the long run, it's worth the time.</p> |
||||
<p>Sometimes the change you need is impossible 'cause the framework you're using |
||||
doesn't have any support for extensions. This is the time you'll need to build |
||||
a new layer <em>on top</em> of the framework. Again, this may seem painful and |
||||
changing the framework directly is a lot easier, but you'll have to keep |
||||
updating your patch for newer versions, which may not be that easy. Building |
||||
on top of the framework will at least give you some assurance 'cause the |
||||
exposed API must be way more stable than the internal code.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/use-structures">If Your Data Has a Schema, Use a Structure</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/resist-easy">Resist The Temptation Of Easy</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,124 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Own Your Shit</h1> |
||||
<span class="post-date"> |
||||
2019-07-30 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/own-your-shit/">#own your shit</a> |
||||
|
||||
</span> |
||||
<p>When I said "Scala is garbage" or "Gerrit is a mistake", it wasn't "l33th4x0r" |
||||
who said that; it was Julio Biason. 'Cause I do believe that putting your face |
||||
to be slapped is the way we grow.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I do understand -- and you must have realized reading some of the previous |
||||
points when I talk about it -- that privacy is important. For some people, |
||||
hiding their real name is important for lots of reasons.</p> |
||||
<p>But I also personally believe that using some weird name and some face that |
||||
isn't yours on your avatar may give you a false sense of "that person is the |
||||
guilty one, not me" when it comes to criticism.</p> |
||||
<p>I mean, yes, I hate Scala with a passion. I do understand <em>why</em> the language |
||||
developers decided to come with some options about it, and I still think those |
||||
decisions were stupid and you should never sacrifice readability for |
||||
ease-to-use.</p> |
||||
<p>But it wasn't some random person using a weird name full of numbers and an |
||||
avatar of some anime saying Scala is garbage. My name is even in this blog |
||||
name, in the URL and in every social network I use there is a picture of me.</p> |
||||
<p>So yeah, Julio said Scala is garbage.</p> |
||||
<p>There is another thing about using your real name and real face: I'm not just |
||||
saying "Scala is garbage", I have to back that up with some facts -- or, in |
||||
this case, personal opinions -- about it. It's not simply an attack to Scala, |
||||
is a somewhat thought out attack on Scala.</p> |
||||
<p>And, on top of that, someone will one day come to me and say "Yeah Julio, that |
||||
thing you said about Scala: It is that way because of this, this and this". |
||||
And I'll probably have to say "You know, you're right: I was wrong." Because I |
||||
can't simply move my mistake to some other personality; who was wrong was |
||||
<em>me</em>. And unless I own my shit up, I'd never get the understanding I'd need to |
||||
see my mistake about Scala in the first place.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/time">You Always Have The Time</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/bad-code-defense">Don't Defend Bad Code</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Create Libraries</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/paper-notes/">#paper notes</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/post-its/">#post its</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/project-organization/">#project organization</a> |
||||
|
||||
</span> |
||||
<p>I've tried to go paperless many, many times. But keeping a notepad and a bunch |
||||
of post its in my desk has been one of the most helpful tools I ever got.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I've even managed to hide all my pens, move notepads to desks and use some |
||||
note-taking application instead. In the end, none of those managed to come |
||||
close to the utility of having something to scribble notes fast, or to draw a |
||||
very high concept of whatever I'm trying to explain.</p> |
||||
<p>Also, a desk full of post its, or even a monitor with a bunch of things around |
||||
gives the impression that you're really busy working -- just be careful to not |
||||
have too many post its, or it will look like you can't complete anything. It |
||||
even beats Trello!</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/libraries">Create Libraries</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/throw-away">Be Ready To Throw Your Code Away</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Design Patters Are Used to Name Solution, Not Find Them</h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/design-patterns/">#design patterns</a> |
||||
|
||||
</span> |
||||
<p>Most of the times I saw design patterns being applied, they were applied as a |
||||
way to find a solution, so you end up twisting a solution -- and, sometimes, |
||||
the problem it self -- to fit the pattern.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>My guess is that the heavy use of "let's apply <em>this</em> design pattern" before |
||||
even understanding the problem -- or even trying to solve it -- comes as a |
||||
form of <a href="/books/things-i-learnt/cargo-cult">cargo cult</a>: "We saw that people |
||||
used this pattern and solved their problem, so let's use it too and it will |
||||
solve our problem". Or, worse: "Design pattern is described by <em>Famous |
||||
Person</em>, so we must use it".</p> |
||||
<p>Here is the thing: Design pattern should <em>not</em> be used as a way to find |
||||
solution to any problems. You may use some of them as base for your solution, |
||||
but you must focus on the <em>problem</em>, not the <em>pattern</em>. </p> |
||||
<p>"Do a visitor pattern will solve this?" is the wrong question. "What should we |
||||
do to solve our problem?" is the real question. Once you went there and solved |
||||
the problem you may look back and see if it is a visitor pattern -- or whatever |
||||
pattern. If it doesn't, that's alright, 'cause you <em>solved the problem</em>. If it |
||||
did... well, congratulations, you now know how to name your solution.</p> |
||||
<p>I've seen this happening a lot: People have a problem; people decided to use a |
||||
pattern; the pattern doesn't actually solve the problem (not in the 100% mark, |
||||
but above 50%); what happens then is that people start twisting the problem to |
||||
fit the pattern or, worse, add new layers to transform the problem into the |
||||
pattern.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/gherkin">Gherkin Is Your Friend to Understand Expectations</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/data-flow">Thinking Data Flow Beats Patterns</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,105 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - People Get Upset About Code And Architecture Quality 'Cause They Care</h1> |
||||
<span class="post-date"> |
||||
2019-07-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/care/">#care</a> |
||||
|
||||
</span> |
||||
<p>At some point, you'll describe some solution/decision about some piece of |
||||
code or some architectural design and people will seem annoyed/pissed about |
||||
it. When people care about a product/code, they do that.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Or maybe <em>you</em> will get annoyed/pissed.</p> |
||||
<p>I think one of the nicest compliments I ever got was "You're annoying 'cause |
||||
you care" when we left a meeting in which we decided to cut corners and do |
||||
things halfway to beat some deadline -- or just 'cause people were not in the |
||||
mood to do things in a more complete way.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/not-done">People Get Upset About Code And Architecture Quality 'Cause They Care</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/learn-about-yourself">You'll Learn About Yourself The Hard Way</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,124 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Nothing More Permanent Than A Temporary Solution</h1> |
||||
<span class="post-date"> |
||||
2019-07-29 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code/">#code</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/writing-code/">#writing code</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/temporary-solutions/">#temporary solutions</a> |
||||
|
||||
</span> |
||||
<p>Depending on where you look, "Nothing more permanent than a temporary |
||||
solution" is either an old Russian proverb or a quote by Milton Friedman. |
||||
Thing is, temporary solutions, unless you think about the future to fix them, |
||||
will become permanent.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A temporary solution may appear either as a proof-of-concept or due some |
||||
restrained deadline. You may create perfect <a href="/books/things-i-learnt/spec-first">system |
||||
specs</a>, you may have a perfect |
||||
understanding of the whole <a href="/books/things-i-learnt/gherkin">in your Gherkin |
||||
files</a> but, at some point, you'll put some |
||||
small script to fix a minor problem, or do a "not so good" solution to a point |
||||
due to deadlines.</p> |
||||
<p>This happens and unless you take steps to get rid of those, you'll end up with |
||||
a bunch of spaghetti code pretty fast. And that will snowball to a point that |
||||
you won't be able to manage the project.</p> |
||||
<p>Once a scrum master suggested that we came with an idea to our product manager |
||||
to do something akin to "Every three sprints, we'll focus on product value; |
||||
the fourth one is ours to fix the things that are annoying us". I don't think |
||||
we ever talking to the product manager about this, but we managed to open |
||||
issues on our ticket system about the small warts we left behind, specially |
||||
due deadlines. So there we had, a specially crafted bug type for "technical |
||||
debt" which we never actually took the time to fix.</p> |
||||
<p>Unless you have a pretty good safety net to fix those, they will life forever. |
||||
And it may be a better option to tell "we can't deliver in time" than adding |
||||
(yet another) temporary solution, as hard as it is to convince the higher ups |
||||
that you can't deliver the product with a temporary solution.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/run-locally">If It Doesn't Run On Your Computer, You Have A Problem</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/config-file">The Config File Is Friend</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,116 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Blogging About Your Stupid Solution Is Still Better Than Being Quiet</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/solutions/">#solutions</a> |
||||
|
||||
</span> |
||||
<p>You may think "This project is so small and so focused on whatever I needed, I |
||||
should never post it on Github. What would people think?" Github is not for |
||||
that.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Github is not a repository for "cool, almost perfect" projects. You're free to |
||||
show that, at some point, you were a beginner<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>You can always come back, review what you did and fix it. It will, as your |
||||
<a href="/books/things-i-learnt/blogging">blog</a>, show that you're improving.</p> |
||||
<p>... or maybe you'll let your project there just to rot. I still have some |
||||
Python projects that I wrote when I was learning the language that, although |
||||
they work, they don't look like Python projects.</p> |
||||
<p>But who knows? Maybe the code you wrote to solve your small problem can help |
||||
someone else to fix their problem, which was not exactly the same, but pretty |
||||
close. Or even you could get a code review that would teach you something new |
||||
about the language/design you used.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Whoever see the first projects I did in |
||||
<a href="https://www.rust-lang.org/">Rust</a> wouldn't think I have 30 years of |
||||
experience in the field. Everybody is a beginner at some point.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/blogging">Blogging About Your Stupid Solution Is Still Better Than Being Quiet</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/things-i-dont-know">Keep A List of Things I Don't Know</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,159 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Organize Your Code by Data/Type, Not Functionality</h1> |
||||
<span class="post-date"> |
||||
2019-07-15 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/project/">#project</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/project-organization/">#project organization</a> |
||||
|
||||
</span> |
||||
<p>A lot of projects assume that you'll put things with the same functionality in |
||||
the same place, no matter what data they deal with. This makes things harder |
||||
to break apart later.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Most projects keep organized by the functionality each component do. For |
||||
example, all the models are in the same place, all the functions that convert |
||||
one model into an internal structure/DTO are kept together, and so on. |
||||
Something like this:</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>. |
||||
</span><span>+-- IncomingModels |
||||
</span><span>| +-- DataTypeInterface |
||||
</span><span>| +-- DataType1 |
||||
</span><span>| +-- DataType2 |
||||
</span><span>| +-- DataType3 |
||||
</span><span>+-- Filters |
||||
</span><span>| +-- FilterInterface |
||||
</span><span>| +-- FilterValidDataType2 |
||||
</span><span>+-- Processors |
||||
</span><span>| +-- ProcessorInterface |
||||
</span><span>| +-- ConvertDataType1ToDto1 |
||||
</span><span>| +-- ConvertDataType2ToDto2 |
||||
</span><span>+-- OutgoingModels |
||||
</span><span> +-- DtoInterface |
||||
</span><span> +-- Dto1 |
||||
</span><span> +-- Dto2 |
||||
</span></code></pre> |
||||
<p>This is fine and works. But when you organize by data, it'll make a lot easier |
||||
to split your project in smaller projects -- 'cause, at some point, you may |
||||
want to do almost the same thing as you're doing right now, but with small |
||||
differences.</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>. |
||||
</span><span>+-- Base |
||||
</span><span>| +-- IncomingModels |
||||
</span><span>| | +-- DataTypeInterface |
||||
</span><span>| +-- Filters |
||||
</span><span>| | +-- FilterInterface |
||||
</span><span>| +-- Processors |
||||
</span><span>| | +-- ProcessorInterface |
||||
</span><span>| +-- OutgoingModels |
||||
</span><span>| +-- DtoInterface |
||||
</span><span>+-- Data1 |
||||
</span><span>| +-- IncomingModels |
||||
</span><span>| | +-- DataType1 |
||||
</span><span>| +-- Processors |
||||
</span><span>| | +-- ConvertDataType1ToDto1 |
||||
</span><span>| +-- OutgoingModels |
||||
</span><span>| +-- Dto1 |
||||
</span><span>... |
||||
</span></code></pre> |
||||
<p>Now you can make a module that deals <em>only</em> with Data1, another that works |
||||
only with Data2 and so on. And then you can break them into isolated modules.</p> |
||||
<p>And then when you have another project that also have Data1 but also deals |
||||
with Data3, you can reuse most of the stuff in the Data1 module.</p> |
||||
<p>And I do understand that this creates an explosion of directories/packages, |
||||
which may seem a bit unnecessary.</p> |
||||
<p>Believe me, I also thought the idea of keeping things by functionality made |
||||
more sense. But in one project, I got a requirement to do almost the same |
||||
thing as I was doing before, but with a small change, which would require one |
||||
less step/transformation (in our example, you can think as the new requirement |
||||
as doing exactly what the Data1, Data2 and Data3 did, with their |
||||
transformations and such, but without the Data3 part). By breaking by their |
||||
types, I managed to create small modules for each one and the new project |
||||
would simply reference Data1 and Data2, but not Data3.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/git-flow">Git-Flow Is The Way To Go</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/libraries">Create Libraries</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,110 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Toxic/Aggressive People Are Not Fixable</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/quit/">#quit</a> |
||||
|
||||
</span> |
||||
<p>Instead of taking the blows and keep moving, maybe it would be better to your |
||||
own health to simply quit.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Unexpected circumstances caused a delay on your task and your boss lashed at |
||||
you.</p> |
||||
<p>You need to keep avoiding a guy that keeps bad mouthing some minority, |
||||
something that you don't agree.</p> |
||||
<p>Another guy keeps an aggressive posture around women, and you know that's not |
||||
something nice to do.</p> |
||||
<p>Yet a third one keeps complaining that, when he's not around, things don't |
||||
work.</p> |
||||
<p>I've to say it: You're in a toxic environment. Even if the pay is nice and the |
||||
project is interesting, it's not worth your health. You'd end up being a |
||||
constantly pissed off, annoyed person on your forties (<em>cough</em>).</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/fixable">Toxic/Aggressive People Are Not Fixable -- Unless It's You</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/small-world">I.T. World Is Really Small</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Resist The Temptation Of Easy</h1> |
||||
<span class="post-date"> |
||||
2019-07-01 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/ides/">#ides</a> |
||||
|
||||
</span> |
||||
<p>Sure that IDE will help you with a ton of autocomplete stuff and let you |
||||
easily build your project, but do you understand what's going on?</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I'm not denying the fact that IDEs make things easier. I'm trying to say that |
||||
you should not rely heavily on their features.</p> |
||||
<p>I mentioned before that you should at least know how to <a href="/books/things-i-learnt/tests-in-the-command-line">run tests on the |
||||
command line</a> and the same |
||||
applies to everything in IDEs: how to build, how to run, how to run tests and, |
||||
let's be honest here, how to find proper names for your variables and |
||||
functions. 'Cause it's nice that the IDE can complete all the names of |
||||
the functions, but if the autocomplete feature was off, would you know which |
||||
function you need? In other words, have you thought at least 10 seconds about |
||||
a good name for your function so you <em>won't</em> need to use autocomplete to |
||||
remember its name?</p> |
||||
<p>These days, IDEs can autocomplete almost everything, from function names to |
||||
even how to name your variables. But using the autocomplete is not always a |
||||
good solution. Finding better names is.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/outside-project">Don't Mess With Things Outside Your Project</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/start-stupid">Start Stupid</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,128 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Take Responsibility For The Use Of Your Code</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/responsibility/">#responsibility</a> |
||||
|
||||
</span> |
||||
<p>This is hard. Very very hard. It's the difference between "freedom" and |
||||
"responsibility".</p> |
||||
<span id="continue-reading"></span> |
||||
<p>There is nothing wrong in writing, for example, a software to capture people's |
||||
faces and detect their ethnicity, but you have to think about what that will |
||||
be used on.</p> |
||||
<p>Even on an open source project, you can take responsibility without blocking |
||||
people. You can make your project harder for people trying to abuse to use it, |
||||
to the point they will have to take control of their own fork.</p> |
||||
<p>One example is a small application called <a href="https://tusky.app/">Tusky</a>, which |
||||
is "An Android client for the microblogging server Mastodon", completely open |
||||
source. Mastodon is a network of microblogging servers with connect to each |
||||
other, kinda like Twitter, but you can pick a different server that is not |
||||
twitter.com and still get updates from that server. One of the servers that |
||||
appeared in the server list is an alt-right server which, as most alt-right |
||||
forums, promote a lot of hate. What Tusky did? When you try to add an account |
||||
on that server, instead of adding the account, <a href="https://github.com/tuskyapp/Tusky/pull/1303">they play a video of Never |
||||
Gonna Give You Up</a>, basically |
||||
<a href="https://en.wikipedia.org/wiki/Rickrolling">rickrolling</a> anyone who, well, is |
||||
an alt-righter.</p> |
||||
<p>Tusky broke the open source license? No, the code is still available. Anyone |
||||
wanting to use the server can pick the code, fork it, remove the rickroll and |
||||
release their own version of the application. But Tusky developers took an |
||||
instead of saying "We'll not take part in promoting hate speech" and one can't |
||||
deny that they did.</p> |
||||
<p>It is a bit hard to do so on the company code -- you would get some reprimands |
||||
if you try to shame or block one of the company clients from using the company |
||||
application -- but you <a href="/books/things-i-learnt/say-no">can say no</a> and, |
||||
depending on how offensive you think the use the code is, you can even start |
||||
looking for a new place to work. People on larger and "cooler" companies, like |
||||
Google, left their jobs because they didn't agree with what the company was |
||||
doing, and so can you.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/say-no">Learn To Say No</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/not-done">Don't Tell It's Done When It's Not</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - "Right Tool For The Job" Is Just To Push An Agenda </h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/right-tool/">#right tool</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/agenda/">#agenda</a> |
||||
|
||||
</span> |
||||
<p>A lot of times I heard "We should use the right tool for the job!" Most of |
||||
those times it was just a way to push an agenda.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>When someone claims we should use the "right tool", the sentence mean there is |
||||
a right tool and a wrong tool to do something -- e.g., using a certain |
||||
language/framework instead of the current language/framework.</p> |
||||
<p>But sadly, none of those times it was really the "right tool". Most of the |
||||
time, the person saying we should use the "right tool" was trying to push |
||||
their own favourite language/framework, either because they disliked the |
||||
current language/framework or because they don't want to push the "hero |
||||
project".</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/cargo-cult">Understand And Stay Away From Cargo Cult</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/right-tool-obvious">The Right Tool Is More Obvious Than You Think</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - The Right Tool Is More Obvious Than You Think</h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/right-tool/">#right tool</a> |
||||
|
||||
</span> |
||||
<p>Maybe you're in a project that needs to process some text. Maybe you're |
||||
tempted to say "Let's use Perl" 'cause you know that Perl is very strong in |
||||
processing text.</p> |
||||
<p>But that may still be not the right tool.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Although Perl is an amazing tool to process files, providing every single |
||||
switch and option you'll ever need, you're missing something: You're working |
||||
on a C shop. Everybody knows C, not Perl.</p> |
||||
<p>Sure, if it is a small, "on the corner" kind of project, it's fine to be in |
||||
Perl; if it is important for the company, it's better that if it is a C |
||||
project.</p> |
||||
<p>One of the reason your hero project may fail is because of this: You may even |
||||
prove that what you thought it was a better solution is actually a better |
||||
solution, but it can't be applied 'cause nobody else can maintain it.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/right-tool-agenda">Right Tool For The Job Is Just To Push An Agenda</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/code-reviews-style">Code Reviews Are Not For Style</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,122 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - If It Doesn't Run On Your Computer, You Have A Problem</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/local-run/">#local run</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/cloud/">#cloud</a> |
||||
|
||||
</span> |
||||
<p>I've seen a lot of systems that would never run on a isolated computer, like |
||||
the developer tool, 'cause the system requires running on a specialized |
||||
environment. Those things are wrong.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Requiring a specialized environment absolutely kills productivity.</p> |
||||
<p>If your system will run on a specialized environment -- and I'm including "the |
||||
cloud" here -- look for something that can abstract whatever you're using. For |
||||
example, if you're using AWS SQS, which is a queue, look for a library that |
||||
can abstract the way a queue works so you can also run with RabbitMQ, which |
||||
can be easily run on your own computer.</p> |
||||
<p>If you're using a very specialized thing, you may have to write the |
||||
abstraction yourself, isolating it from the main system, so you can develop |
||||
the main product in peace.</p> |
||||
<p>One of the most productivity killer environment I worked require running the |
||||
project on a customized Apache installation, running the client specialized |
||||
framework. The whole problem is that the client refused to allow us to not use |
||||
it or install on our local machines (mostly 'cause the install of said |
||||
framework was really complex). In other for us to work and see things working, |
||||
we had to use a VPN to the client computers, develop things there and manually |
||||
forcing things to reload. No only we had absolutely nothing to do when the VPN |
||||
was down ('cause it require out company infrastructure working hand-in-hand |
||||
with the client infrastructure and the internet provider infrastructure, which |
||||
is absolutely impossible), the flow was really cumbersome.</p> |
||||
<p>If we had the chance to not use it and run all the development and tests on |
||||
our own computers, I have the feeling we could deliver the product 2-3 months |
||||
earlier.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/units">Units Makes Things Clear</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/permanent-solution">Nothing More Permanent Than A Temporary Solution</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,110 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Learn To Say No</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/say-no/">#say no</a> |
||||
|
||||
</span> |
||||
<p>Sometimes, you'll have to say no: No, I can't do it; no, it can't be made in |
||||
this time; no, I don't feel capable of doing this; no, I don't feel |
||||
comfortable writing this.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Saying no doesn't mean you won't do it. Once I had to say to our CTO: "Ok, |
||||
I'll do it, but I want to note that I don't agree with what we are doing." In |
||||
the end, the app was barred exactly because the thing we were doing.</p> |
||||
<p>Being explicit about what you don't feel is a good point may not be what some |
||||
higher ups are expecting. The fact that you don't approve but will do it |
||||
anyway may be something that can either show that your not simply a drone or, |
||||
unfortunately, label you as a "troublemaker". Honestly, if you feel it threw |
||||
you in the former, you should start looking for a new place to work. If you |
||||
said you won't be comfortable and still <em>did the work</em>, and they had to label |
||||
you something, then this place doesn't respect you as a person.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/coc">Code of Conduct Protect YOU, Not THEM</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/responsible-code">Take Responsibility For The Use Of Your Code</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,116 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - I.T. World Is Really Small</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
</span> |
||||
<p>We have two expressions here: "The world turns around"; it means whatever you |
||||
do, sometime in the future, you'll face the consequences of it. Another |
||||
expression is "The world of <em>something</em> is an egg"; because the world turns |
||||
around, if the world is an egg, you'll face the consequences sooner than you |
||||
think.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>What do I meant with those two expressions?</p> |
||||
<p>Well, first thing, if you do a bad job, if you don't care about your |
||||
co-workers, if you're not a team player, if you keep bad mouthing someone... |
||||
You'll find someone that heard about the things you do and may damage your |
||||
reputation.</p> |
||||
<p>So be nice and a team player.</p> |
||||
<p>Just to be clear: Yes, I did my fair share of not being a team player and bad |
||||
mouthing people<sup class="footnote-reference"><a href="#1">1</a></sup> and I'm pretty sure there are companies around that would |
||||
never hire me 'cause someone inside heard that I bad mouth someone or didn't |
||||
do as a team player in some other place. I try to avoid doing it so as much as |
||||
I can but, hey, I'm just human.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>I still call actions of previous colleagues around even to this day. If |
||||
I'm bad mouthing or just telling what happened is up to whoever is listening |
||||
to me.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/quit">Realize When It's Time To Quit</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/blogging">Blogging About Your Stupid Solution Is Still Better Than Being Quiet</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,130 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Spec First, Then Code</h1> |
||||
<span class="post-date"> |
||||
2019-06-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/specs/">#specs</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code/">#code</a> |
||||
|
||||
</span> |
||||
<p>"Without requirements or design, programming is the art of adding bugs to an |
||||
empty text file." -- Louis Srygley</p> |
||||
<span id="continue-reading"></span> |
||||
<p>If you don't know what you're trying to solve, you don't know what to code.</p> |
||||
<p>A lot of times we have this feeling of "let me jump straight to the code". But |
||||
without understanding what problem you're trying to solve, you'd end up |
||||
writing a bunch of things that doesn't solve anything -- or, at least, |
||||
anything that <em>should</em> be solved.</p> |
||||
<p>So here is the point: Try to get a small spec on whatever you want to solve. |
||||
But be aware that even that spec may have to be <a href="/books/things-i-learnt/throw-away">thrown |
||||
out</a>, as the understanding of the problem |
||||
tend to grow as long as the project continue.</p> |
||||
<p>Yes, it's paradoxical: You need a spec to know what to code to avoid coding |
||||
the wrong solution, but the spec may be wrong, so you <em>end up</em> solving the |
||||
wrong solution anyway. So what's the point? The point is, the spec reflects |
||||
the understanding of a problem <em>at a certain point</em>: All you (and your team) |
||||
know is <em>there</em>.</p> |
||||
<p>The times I stood longer looking at my own code wondering what to do next were |
||||
when we didn't have the next step defined: It was missing some point of the |
||||
solution or we didn't have the communication structures defined or something |
||||
of sorts. Usually, when that happened, I stumbled upon Twitter or Mastodon |
||||
instead of trying to solve the problem. So when you see yourself doing this |
||||
kind of stuff -- "I don't know what to do next, and I'm not sure if I'm done |
||||
with the current problem" -- then maybe it's time to stop and talk to other |
||||
people in the project to figure that out.</p> |
||||
<p>Another way to think this: Erik Deitrich have a post about <a href="https://daedtech.com/dont-learn-to-code-learn-to-automate/">Don’t Learn to |
||||
Code — Learn to Automate</a>, |
||||
something I can get behind 'cause most of us, when doing stuff, think "I need |
||||
to do this, then I pick that thingy and put it there and from there I do this |
||||
other work". Basically, we create mental models of specs, step by step, on |
||||
what we need to do. And, from there, it may be even simpler, 'cause now all |
||||
you need to learn is "First, how I do this; Ok, got it, now I get the result |
||||
from this and put there" and so on. You can even have a learning path, if |
||||
you're a beginner.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/disclaimer">Disclaimer</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/steps-as-comments">Write Steps as Comments</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Companies Look For Specialists But Keep Generalists Longer</h1> |
||||
<span class="post-date"> |
||||
2019-07-17 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/jobs/">#jobs</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/specialists/">#specialists</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/generalists/">#generalists</a> |
||||
|
||||
</span> |
||||
<p>If you know a lot about one single language, it may make it easier to get a |
||||
job, but in the long run, language usage dies or loses its charms and you'll |
||||
need to find something else. Knowing a bit about a lot of other languages |
||||
helps in the long run, not to mention that may help you think of better |
||||
solutions.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Even if you're in a shop that is mainly in one single language, that's no |
||||
excuse to not check other languages. But, then again, learning languages that |
||||
are just small changes on the current language would not help you either.</p> |
||||
<p>Alan Perlis, author of the ALGOL language, has one excellent phrase: "A |
||||
language that doesn't affect the way you think about programming, is not worth |
||||
knowing."</p> |
||||
<p>I still maintain one single rule for programming languages: The language I use |
||||
at work must not be the same language I use outside it<sup class="footnote-reference"><a href="#1">1</a></sup>. That simple rule |
||||
made sure I was always learning something new.</p> |
||||
<p>Learning a new language can also help you understand things in some language |
||||
you used before: Rust help me understand how generics works in Java; seeing |
||||
how to do dependency injection in C++ help me understand how Spring does it in |
||||
Java.</p> |
||||
<p>On top of that, because I was always learning something new, moving between |
||||
projects was something that happened a lot. At one point, I was hired to work |
||||
with Python, but the contract was taking too long to be signed, and my manager |
||||
asked if I could help some other team with their iOS application. Because I |
||||
did learn a bit about Objective-C, surely I could help. Later, another project |
||||
in C show up and guess who also knew C?</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>... which led me into some sad times when I was working with Python.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/team-discussion">Global Changes Must Be Discussed With The Whole Team First</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/stupid-bugs-list">Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Start Stupid</h1> |
||||
<span class="post-date"> |
||||
2019-07-01 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/kiss/">#kiss</a> |
||||
|
||||
</span> |
||||
<p>One way to get away from the IDE is to "start stupid": Just get the compiler |
||||
and get an editor (ANY editor) with code highlight and do your thing: Code, |
||||
build it, run it.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Notice that say "stupid way", not "simple way".</p> |
||||
<p>Doing things in the stupid way is not the easiest way to start a project. How |
||||
could one beat the easy of clicking a button and having the whole structure of |
||||
a project done for you?</p> |
||||
<p>But starting it in the stupid way, in which you have to think your project |
||||
layout, how to build stuff, how to run tests, how to do <em>everything</em> may give |
||||
you some insights on how things work, how the pieces mesh together and how to |
||||
cogs turn around. Even better: It make give you some insights on what |
||||
<em>doesn't</em> work.</p> |
||||
<p>Honestly, you don't have to do this with all projects. You can still use your |
||||
favourite IDE and do things in the easy way. But you can also have that side |
||||
project on which you'll do everything in the stupid way, just to understand |
||||
what your IDE is doing.</p> |
||||
<p>And when you grasp that, you'll be able to use <em>any</em> IDE.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/resist-easy">Resist The Temptation Of Easy</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/use-timezones">Always Use Timezones With Your Dates</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,141 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Write Steps as Comments</h1> |
||||
<span class="post-date"> |
||||
2019-06-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/steps/">#steps</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/comments/">#comments</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code/">#code</a> |
||||
|
||||
</span> |
||||
<p>Don't know how to solve your problem? Write the steps as comments in your |
||||
code.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>There you are, looking at the blank file wondering how you're going to solve |
||||
that problem. Here is a tip:</p> |
||||
<p>Take the spec you (or someone else) wrote. Break each point into a series of |
||||
steps to reach the expected behaviour. You can even write on your natural |
||||
language, if you don't speak English.</p> |
||||
<p>Then fill the spaces between the comments with code.</p> |
||||
<p>For example, if you have a spec of "connect to server X and retrieve |
||||
everything there. Save the content in the database. Remember that server X API |
||||
allow you can pass an ID (the last ID seen) and you can use it to not retrieve |
||||
the same content again." Pretty simple, right?</p> |
||||
<p>Writing this as comments, pointing the steps you need to make, you may end up |
||||
with something like this:</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>// connect to server X |
||||
</span><span>// retrieve posts |
||||
</span><span>// send posts to the database |
||||
</span></code></pre> |
||||
<p>Ah, you forgot the part about the ID. No problem, you just have to add it in |
||||
the proper places -- for example, it doesn't make sense to connect to the |
||||
server before you have the last seen ID:</p> |
||||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>// open configuration file |
||||
</span><span>// get value of the last seen ID; if it doesn't exist, it's empty. |
||||
</span><span>// connect to server X |
||||
</span><span>// retrieve posts starting at the last seen ID |
||||
</span><span>// send posts to the database |
||||
</span><span>// save the last seen ID in the configuration file |
||||
</span></code></pre> |
||||
<p>Now it is "easy"<sup class="footnote-reference"><a href="#1">1</a></sup>: You just add the code after each comment.</p> |
||||
<p>A better option is to change the comments into functions and, instead of |
||||
writing the code between the comments, you write the functionality in the |
||||
function themselves and keep a clean view of what your application does in the |
||||
main code.</p> |
||||
<p>In <a href="https://blog.pragmaticengineer.com/a-comment-is-an-invitation-for-refactoring/">A Comment Is An Invitation For |
||||
Refactoring</a>, |
||||
Gergely Orosz points that comments in the code could be converted to function |
||||
calls, including things like grouping common things, or bugfixes. This is, |
||||
basically, the same thing, except in different points of development: One when |
||||
the code is about to be written and one when the code is already there.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Yes, that was sarcastic.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/spec-first">Specs First, Then Code</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/gherkin">Gherkin Is Your Friend to Understand Expectations</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve</h1> |
||||
<span class="post-date"> |
||||
2019-07-17 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/lists/">#lists</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/stupid-bugs/">#stupid bugs</a> |
||||
|
||||
</span> |
||||
<p>If it took you more than one hour for you to figure out what went wrong, it is |
||||
a good idea to put it on list, 'cause these things have the tendency to appear |
||||
again.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I must admit that this is one thing that I should be doing, but I keep |
||||
forgetting. The worst part: It usually takes me about an hour to figure out |
||||
what went wrong, only to realize by the solution that I had the same problem |
||||
(with the same solution) before and it took me about one hour to figure out |
||||
what went wrong.</p> |
||||
<p>If I just had a list of stupid bugs that took me about 1 hour or more to |
||||
solve, I wouldn't be stuck for another hour figuring out what went wrong.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/specialists">Companies Look For Specialists But Keep Generalists Longer</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/time-to-stop">When It's Time to Stop, It's Time To Stop</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,123 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Global Changes Must Be Discussed With The Whole Team First</h1> |
||||
<span class="post-date"> |
||||
2019-07-31 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/team/">#team</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/changes/">#changes</a> |
||||
|
||||
</span> |
||||
<p>So you got tired of bad tests and decided it is a good idea to add some <a href="https://en.wikipedia.org/wiki/Fuzzing">fuzz |
||||
testing</a> tool. Before you do add it in |
||||
the main branch, you <em>have</em> to discuss it with your team.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>It's mind-bogging that some people think something it's so good that they |
||||
don't need to discuss with the whole team about it; they simply do. They don't |
||||
seem to care that people have their workflows and changing something would |
||||
break them. But hey, I've seen it so many times it is not even fun.</p> |
||||
<p>And let me clear here: You need to discuss it with the <em>whole</em> team, not just |
||||
some of it (excluding people on vacations, 'cause you don't want to call them |
||||
just to tell them something will change). Worse: Don't discuss only with those |
||||
that will agree with you; you may not have seen all the problems those changes |
||||
will inflict on the other devs workflows but, by bringing that with those that |
||||
may not agree with you, you may gain some more insights on what could go |
||||
wrong.</p> |
||||
<p>Also, focus on what would be the gains and the loses. "We'll get better tests, |
||||
but you'll have to take a bit more care on the way you write tests" is a good |
||||
explanation, specially if you show the changes people will have to do in |
||||
future tests. Also also, notice that I said <em>future</em> tests: if you want to |
||||
implement something new, you <em>must</em> be sure it won't require everyone getting |
||||
out of their way to make your idea work -- don't make people rewrite tests |
||||
'cause they will break; don't make the other devs reformat their code 'cause |
||||
you decided, alone, to add a linter to your CI with your own rules; don't make |
||||
people worry about unwritten tests 'cause you decided it would be a good idea |
||||
to add a code formatting tool and that would make your coverage tool think |
||||
they are changing some unrelated piece of code that wasn't untested before.</p> |
||||
<p>Don't be a jerk thinking you know more than your whole team.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/hero-projects">Global Changes Must Be Discussed With The Whole Team First</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/specialists">Companies Look For Specialists But Keep Generalists Longer</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,129 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Tests Make Better APIs</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/book/">#book</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/unit-tests/">#unit tests</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/layers/">#layers</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/apis/">#apis</a> |
||||
|
||||
</span> |
||||
<p>Testing things in isolation may give a better view of your APIs.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>After reading the <a href="/books/things-i-learnt/integration-tests">integration tests</a> |
||||
chapter, you may end up with the impression that I don't like unit tests<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>Actually, I think they provide some good intrinsic values.</p> |
||||
<p>For example, as mentioned before, they can provide a better look at the |
||||
adherence to the design.</p> |
||||
<p>But, at the same time, they give a better view of your internal -- and even |
||||
external -- APIs.</p> |
||||
<p>For example, you're writing the tests for the view layer -- 'cause, you know, |
||||
we write everything in layers; layers on top of layers<sup class="footnote-reference"><a href="#2">2</a></sup> -- and you're noticing |
||||
that you have to keep a lot of data (state) around to be able to make the |
||||
calls to the controller. Or that you have similar calls, but the parameters |
||||
are sometimes switched (say, one function gets a token and a user ID, and |
||||
another function gets a user ID and a token -- why?) That's a sign that you |
||||
may have to take a better look at the controller API.</p> |
||||
<p>Not only that, but take, for example, the fact that you're working on a |
||||
library -- which will be called by someone else -- and you're writing tests |
||||
for the most external layer, the layer that will be exposed by that library. |
||||
And, again, you're noticing that you have to keep a lot of context around, |
||||
lots of variables, variables coming from different places and similar calls |
||||
using parameters in different ways. Your tests will look like a mess, don't |
||||
they? That's because the API <em>is</em> a mess.</p> |
||||
<p>Unit testing your layers makes you the <em>user</em> of that layer API, and then you |
||||
can see how much one would suffer -- or, hopefully, enjoy -- using that.</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>Again, let's ignore for a second that there are no "unit" in "unit |
||||
tests"... |
||||
<sup class="footnote-reference"><a href="#2">2</a></sup>: And layers all the way down, <a href="https://en.wikipedia.org/wiki/Turtles_all_the_way_down">like |
||||
turtles</a>.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/integration-tests">Unit Tests Are Good, Integration Tests Are Gooder</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/tests-in-the-command-line">Make Tests That You Know How To Run on the Command line</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,138 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Testing Every Function Creates Dead Code</h1> |
||||
<span class="post-date"> |
||||
2019-06-21 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/unit-tests/">#unit tests</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/dead-code/">#dead code</a> |
||||
|
||||
</span> |
||||
<p>If you write a test for every single function on your system, and your system |
||||
keeps changing, how will you know when a function is not necessary anymore?</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Writing a test for every single function on your system may come from the |
||||
"100% Coverage Syndrome", which afflicts some managers, thinking that the only |
||||
way to be completely sure your system is "bug free" is to write tests for |
||||
every single line of code, till you reach the magical "100% coverage" in all |
||||
the tests.</p> |
||||
<p>I do believe you can reach 100% coverage, as long as you're willing to |
||||
<em>delete</em> your code.</p> |
||||
<p>(Cue the universal grasps here.)</p> |
||||
<p>But how do you know which pieces of code can be deleted?</p> |
||||
<p>When I mentioned <a href="/books/things-i-learnt/integration-tests">integration |
||||
tests</a>, I mentioned how much more |
||||
sense it made to me reading them instead of the "unit" tests, because they |
||||
were describing exactly how the system would operate in normal (and some |
||||
abnormal) conditions. If you write tests that go through the system, assuming |
||||
it is a black box with an input point and an output, and you can get tests for |
||||
all the normal cases -- and some "abnormal", like when things go wrong -- then |
||||
you know that, if you run those tests and they mark some lines as "not |
||||
tested", it's because you don't need them.</p> |
||||
<p>"But Julio, you're forgetting the error control!" I do agree, specially when |
||||
you're talking with project owners or some other expert, that people will |
||||
forget to tell you what to do in case of things going wrong -- say, the user |
||||
typing their name in the age field -- but <em>you</em> can see those and <em>you</em> know |
||||
that you need error control so <em>you</em> can add the error control and describe |
||||
the situation where that error control would trigger.</p> |
||||
<p>If, on the other hand, you write a test for every function, when you do a |
||||
short/simple check, you'll find that the function is still being used in the |
||||
system by the tests, not actually, "value to the user" code. Sure, you can |
||||
use your IDE to go back and forth between code and test and see if it points a |
||||
use beyond the test, but it won't do it for yourself.</p> |
||||
<p>There is one other weird thing about using integration tests for error |
||||
controls: Sometimes, you can't reach the control statement. It's true! I did |
||||
wrote control checks for every function once but, when running in the |
||||
integration tests, there was no way to produce an input at the input layer of |
||||
the system that would reach the error control in that function 'cause the |
||||
other functions, which would run before the one I was trying to test, would |
||||
catch the error before it. If that's a design problem or not -- it probably |
||||
was -- it's a different discussion, but the fact is that that function didn't |
||||
need error control, something that I wouldn't see if I wrote test specifically |
||||
for it, but it was clear in an integration test run.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/integration-tests">Unit Tests Are Good, Integration Tests Are Gooder</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/tests-apis">Tests Make Better APIs</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Make Tests That You Know How To Run on the Command line</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/book/">#book</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/tests/">#tests</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/command-line/">#command line</a> |
||||
|
||||
</span> |
||||
<p>You know that "Play" with a little something on your IDE that runs only the |
||||
tests? Do you know what it does?</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A long time ago I read the story about a professor that taught his students to |
||||
code. He preferred to teach using an IDE, 'cause then "students have to just |
||||
press a button to run the tests".</p> |
||||
<p>I get the idea, but I hate the execution.</p> |
||||
<p>When we get into professional field, we start using things like <a href="https://en.wikipedia.org/wiki/Continuous_integration">continuous |
||||
integration</a> which, |
||||
basically, is "run tests every time something changes" (it's a bit more than |
||||
that, but that's the basic idea).</p> |
||||
<p>Now, let me ask you this: Do you think the students of the professor above |
||||
would know how to add the command to run the tests in a continuous |
||||
integration system?</p> |
||||
<p>I know I'm being too picky (one could even call me "pricky" about this) but |
||||
the fact is that whatever we do today, at some point can be automated: our |
||||
tests can be run in an automated form, our deployment can be run in an |
||||
automated form, our validation can be run in an automated form and so on. If |
||||
you have no idea how those things "happen", you'll need the help of someone |
||||
else to actually build this kind of stuff, instead of having the knowledge |
||||
(well, half knowledge, the other half is the CI tool) with you all the time.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/tests-apis">Tests Make Better APIs</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/languages-tests">Good Languages Come With Tests</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,93 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Keep A List of Things I Don't Know</h1> |
||||
<span class="post-date"> |
||||
2019-07-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-don-t-know/">#things i don't know</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/richard-feyman/">#richard feyman</a> |
||||
|
||||
</span> |
||||
<p>Richard Feymann, famous physicist, kept a notebook with the title "Things I |
||||
Don't Know".</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I keep a similar "Task List" for myself. If some technology starts appearing |
||||
everywhere or something grabs my attention, but I don't have the time to |
||||
research it, I put it on this task list.</p> |
||||
<p>When I start my research, I keep some notes together, although <a href="/books/things-i-learnt/paper-notes">not on |
||||
paper</a>, so I can use as reference in the |
||||
future.</p> |
||||
<p>{{ chapters(prev_chapter_link="/books/things-i-learnt/post-solution", prev_chapter_title="Don't Hide Your Stupid Solution", next_chapter_link="/books/things-i-learnt/time", "next_chapter_title="You Always Have The Time") }}</p> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Be Ready To Throw Your Code Away</h1> |
||||
<span class="post-date"> |
||||
2019-06-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/book/">#book</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/code/">#code</a> |
||||
|
||||
</span> |
||||
<p>A lot of people, when they start with TDD, get annoyed when you say that you |
||||
may have to rewrite a lot of stuff, including whatever your already wrote.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>TDD was <em>designed</em> to throw code away: The more you learn about your problem, |
||||
the more you understand that, whatever you wrote, won't solve the problem in |
||||
the long run. Also, as you slowly solve new problems, you may notice some |
||||
pattern in the code emerging (you're doing the same thing over and over, with |
||||
only minor changes). That's a good time to go over and rewrite everything to |
||||
take advantage of this pattern.</p> |
||||
<p>You shouldn't worry about this. Your code is not a wall (or any physical |
||||
object): if you have to throw it away, you didn't wasted materials. Surely it |
||||
means your time writing code was lost, but you got a better understanding |
||||
about the problem now, or you may start to think in a more concise way to |
||||
solve the problem.</p> |
||||
<p>Not only that, but as you progress through your project, solving problems and |
||||
getting "acquainted" with the problem, you'll also notice that the |
||||
<a href="/books/things-i-learnt/spec-first">spec</a> will also change. This means that |
||||
the problem your code solve wasn't exactly the problem you <em>needed</em> to solve; |
||||
your code is trying to solve something that isn't exactly the problem.</p> |
||||
<p>Also, specs changing is really common. One thing that you can be sure is that |
||||
it won't change <em>everywhere</em>. Some of the things you solved will stay the |
||||
same, some others will be completely removed and some others added. And you |
||||
will see that you'll refactor your code a lot, and throw a lot of code away. |
||||
And not just code that solves the problem, but also the tests for that code.</p> |
||||
<p>... unless you focus mostly on <a href="/books/things-i-learnt/integration-tests">integration |
||||
tests</a>.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/paper-notes">Be Ready To Throw Your Code Away</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/future-trashing">Future Thinking Is Future Trashing</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - When It's Time to Stop, It's Time To Stop</h1> |
||||
<span class="post-date"> |
||||
2019-07-18 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/stop/">#stop</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal-time/">#personal time</a> |
||||
|
||||
</span> |
||||
<p>Learn when you can't code anymore.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Learn when you can't process things anymore.</p> |
||||
<p>Don't push beyond that, it will just make things worse in the future.</p> |
||||
<p>I tried to keep coding once when I had a migraine (not strong, but not mild). |
||||
Next day, when I was better, I had to rewrite most of the stuff I did, 'cause |
||||
it was all shit.</p> |
||||
<p>Also, when you're not feeling fine, you won't be able to concentrate and your |
||||
productivity will plunge. It's a lot better to be a burden to society at your |
||||
own place than a burden to society at work.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/stupid-bugs-list">Keep A List of Stupid Bugs That Took More Than 1 Hour To Solve</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/coc">Code of Conduct Protect YOU, Not THEM</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,116 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - You Always Have The Time</h1> |
||||
<span class="post-date"> |
||||
2019-07-29 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/time/">#time</a> |
||||
|
||||
</span> |
||||
<p>You may think "Alright, I have a list of things I don't know, but I have no |
||||
time to learn those things!" You do have time.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Most of this blog/book was written during my lunch breaks; I can have my lunch |
||||
in 30 minutes, and then I still have 20-30 minutes free for myself. In those |
||||
lunch breaks, I wrote a very stupid application in Rust to download some stuff |
||||
I wanted.</p> |
||||
<p>I don't fall asleep straight away, it still takes me about 30 minutes to |
||||
actually feel sleepy. That's when I pick my tablet and read a book, which most |
||||
of the time is technical book, about some technology I'm interested in.</p> |
||||
<p>Even if when I get home I don't feel like sitting in front of a computer to |
||||
code/write something, I always have the time to slowly progress.</p> |
||||
<p>And that's how I always have the time.</p> |
||||
<p>Sure, I could take those 30 minutes after lunch just to play games. I could |
||||
put myself to sleep watching Netflix. But, then again, I'd never wrote this |
||||
bunch of words, would never have an automated downloader and would not learn |
||||
about new stuff that people are talking about.</p> |
||||
<p>Maybe people think "If I don't finish, it's over". Your life doesn't end in |
||||
one day. You still have tomorrow to keep going -- <em>to keep going</em>, not to |
||||
start.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/things-i-dont-know">Keep A List of Things I Don't Know</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/own-your-shit">Own Your Shit</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Beware of Toxic People</h1> |
||||
<span class="post-date"> |
||||
2019-07-23 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/toxic-people/">#toxic people</a> |
||||
|
||||
</span> |
||||
<p>You'll find people that, even if they don't small talk you, they will bad |
||||
mouth everything else -- even some other people -- openly.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Toxic people love drama. They love to put people down. They love to point |
||||
mistakes made by others -- but never by themselves. Some of them actually do |
||||
that to make themselves look better in the eyes of the upper management.</p> |
||||
<p>Not totally toxic, but I did work with people who would never answer an email |
||||
unless the manager was in the discussion. Another person would always claims |
||||
his team did everything they could, even putting himself at the disposal of |
||||
the manager to solve any issues, and that the problem was not related to their |
||||
work -- which we proved three times it was.</p> |
||||
<p>You need to stay away from those people. They will harm in ways you can figure |
||||
out immediately. Their attitude towards other (and maybe even yourself) will |
||||
drive you so down you'll waste more time wondering what you did wrong than |
||||
doing your job.</p> |
||||
<p>One thing to take a lot of care: Even if it is not your intention, you may not |
||||
realize that you may be seen as toxic 'cause <a href="/books/things-i-learnt/learn-about-yourself">you don't understand yourself |
||||
yet</a> and the way <a href="/books/things-i-learnt/watch-reactions">people react to |
||||
you</a>.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/hero-syndrome">Don't Confuse Hero Project With Hero Syndrome</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/microaggressions">Beware of Microaggressions</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Be Transparent With The User</h1> |
||||
<span class="post-date"> |
||||
2019-07-31 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/ux/">#ux</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/ui/">#ui</a> |
||||
|
||||
</span> |
||||
<p>Since we are talking about <a href="/books/things-i-learnt/log-events">logging</a>, |
||||
another thing you must do is to be transparent with the user in your user |
||||
interface.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>And by "be transparent", I meant that your website/mobile app needs to point |
||||
out to the user that the webserver is down instead of saying to the user to |
||||
check their internet connection; your application <em>is</em> getting something from |
||||
the webserver, so you <em>can</em> say "Oops, something wrong on our side".</p> |
||||
<p>Another example: If you need to check a bunch of data before saying "It's |
||||
done", add a counter to show the user that the application is doing something. |
||||
<a href="https://joplinapp.org/">Joplin</a>, when syncing data with a webdav server, |
||||
needs to check a bunch of files; one version would simply sit still with a |
||||
spinner on "Syncing" and nothing more; when they added a counter, I could |
||||
easily see that there was something going on.</p> |
||||
<p>Those small details, for as bad as they may make you look, will win points |
||||
with the user in the long run.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/log-events">Logs Are For Events, Not User Interface</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/add-then-remove">One Version To Add, One Version To Remove</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,118 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Shortcuts Are nice, But Only In The Short Run</h1> |
||||
<span class="post-date"> |
||||
2019-07-08 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/frameworks/">#frameworks</a> |
||||
|
||||
</span> |
||||
<p>A lot of languages/libraries/frameworks add a way to make things shorter, |
||||
reducing the number of things you need to type.</p> |
||||
<p>But, later, that will bite you and you'll have to remove the shortcut and do |
||||
the long things.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Frameworks and libraries -- and even some languages -- come with "helpers" for |
||||
most boilerplate things. Instead of typing the same 5 lines of code over and |
||||
over, you can use a simple function; instead of writing the function with 5 |
||||
parameters, you can skip a bit and use another one with just one. Or you could |
||||
just add a simple macro expansion on top of your struct/class and it would |
||||
complete all the missing points.</p> |
||||
<p>Don't get me wrong, they are great.</p> |
||||
<p>But you must understand what the macro/function is hiding from you. 'Cause |
||||
sooner or later, you'll find a case where it doesn't have a perfect fit and |
||||
you need to change just a small detail. And then you'll start running in |
||||
circles 'cause, well, how the hell the macro/function did <em>that</em>?</p> |
||||
<p>I've bitten before by <a href="http://spring.io/">Spring</a> and |
||||
<a href="https://serde.rs/">Serde</a> 'cause I started with the shortcuts without |
||||
understanding what they were doing. And then I got a problem which the |
||||
shortcut wouldn't solve, requiring me to go deep into the documentation. And |
||||
because I skipped a few steps and jumped straight into the shortcut, it took |
||||
me awhile to actually get <em>what</em> I needed to do different from the shortcut to |
||||
solve my problem: I had no idea what the shortcut did and, thus, I had no idea |
||||
what I needed differently from the shortcut to solve my problem.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/functional-programming">Learn The Basics of Functional Programming</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/debuggers">Debuggers Are Overrated</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Units Makes Things Clear</h1> |
||||
<span class="post-date"> |
||||
2019-07-17 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/units/">#units</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/explicit/">#explicit</a> |
||||
|
||||
</span> |
||||
<p>You know what's one of the worst function names ever? <code>sleep()</code>.</p> |
||||
<p>Sleep for how long? It is seconds or milliseconds?</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Now let me ask you this: Would it clearer if the function was called |
||||
<code>sleepForMs()</code>? Would you understand that the function would make the |
||||
application sleep for a number of milliseconds?</p> |
||||
<p>What about <code>sleepForSecs()</code>? Do you understand that this will force your |
||||
application to sleep for a number of seconds?</p> |
||||
<p>What if, instead of using the function name, you could use <code>sleep("10s")</code>? Does |
||||
it make clear that you want it to sleep for 10 seconds?</p> |
||||
<p>That's why adding units to the function or parameters make sense. It removes |
||||
the ambiguity of what it means and doesn't rely on some specialized IDE/Editor |
||||
that display the parameter names.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/optimization">Optimization Is For Compilers</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/run-locally">If It Doesn't Run On Your Computer, You Have A Problem</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,141 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - If Your Data Has a Schema, Use a Structure</h1> |
||||
<span class="post-date"> |
||||
2019-06-25 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/data-classes/">#data classes</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/structs/">#structs</a> |
||||
|
||||
</span> |
||||
<p>You may be tempted to use a list (or tuple, if your language allows) to keep |
||||
your data if it has, say, only 2 fields. Don't.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Some languages allow unstructured data to be kept in the format of tuples: |
||||
They act like lists, but you can use to store heterogeneous data (which is a |
||||
cute way of "it stores fields of different types").</p> |
||||
<p>This languages also allow you to "destructurize" them, so you can extract |
||||
elements from them without directly accessing them by index.</p> |
||||
<p>For example, in Python, you can have a tuple with:</p> |
||||
<pre data-lang="python" style="background-color:#2b303b;color:#c0c5ce;" class="language-python "><code class="language-python" data-lang="python"><span>a_tuple = ('</span><span style="color:#a3be8c;">A String</span><span>', </span><span style="color:#d08770;">1</span><span>, </span><span style="color:#d08770;">7.5</span><span>) |
||||
</span></code></pre> |
||||
<p>And you can destructure it with</p> |
||||
<pre data-lang="python" style="background-color:#2b303b;color:#c0c5ce;" class="language-python "><code class="language-python" data-lang="python"><span>some_string, an_integer, a_float = a_tuple |
||||
</span></code></pre> |
||||
<p>See? It's simple! You don't need to create a whole structure if you're just |
||||
passing a string, an integer and a float around.</p> |
||||
<p>Except, you do need a structure 'cause your data has a <em>schema</em>.</p> |
||||
<p>Tuples and destructuring should be used only when you need to pass data from |
||||
one function to another -- and barely that. When you have this tuple being |
||||
passed around, being destructured and created again -- say, you are adding one |
||||
value of the tuple to another value and producing a new tuple in the same |
||||
format -- then you have a structured -- and <em>schemaed</em> data.</p> |
||||
<p>And when you have a structured data, you must use a data class or a struct (or |
||||
even |
||||
<a href="https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.namedtuple">NamedTuples</a>, |
||||
if you're using Python).</p> |
||||
<p>Although it may look way more simpler to keep destructuring and building the |
||||
tuple over and over, in the long run you'll end up with a mess: a simple |
||||
change -- like adding a new field -- will require checking every destructuring |
||||
and every creation of the tuple to make sure if will stay in the same shape |
||||
every time.</p> |
||||
<p>So: You data has a schema? Use a Data Class or Class or Struct. Only if it is |
||||
schemaless, then you can use a tuple.</p> |
||||
<p>I've seen this used at least once. At the very start of the project, it |
||||
may seem easier to just store the data as a tuple and destructure it and build |
||||
it again when needed. There was even a whole module designed to receiving |
||||
tuples, destructure them and rebuild new ones (for example, a function that |
||||
would receive two tuples and compute the sum of the "value" field of each, |
||||
building a new tuple as a result). But because of this design, to add just a |
||||
new field, I had to change 14 files and do 168 changes around -- 'cause there |
||||
was a function to add two tuples, but there were points where you need just |
||||
one field, and there wasn't a function for it.</p> |
||||
<p>It would be easier to use if there were functions to extract each field, and |
||||
add two tuples, and what else was needed for managing the tuples, but then you |
||||
have to ask yourself: Why not use a class for that?</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/data-types">Types Say What Your Data Is</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/outside-project">Don't Mess With Things Outside Your Project</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,121 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Always Use Timezones With Your Dates</h1> |
||||
<span class="post-date"> |
||||
2019-07-01 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/dates/">#dates</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/timezones/">#timezones</a> |
||||
|
||||
</span> |
||||
<p>No matter if the date you're receiving is in your local timezone and you'll |
||||
display it in your timezone, sooner or later, the fact that you ignored there |
||||
was a timezone behind that date will hurt you.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>(Note: Most of this post when I say "date" you can think of "date and time", |
||||
although the date should also be "timezone aware".)</p> |
||||
<p>At some point of my professional life, ignoring timezones was easy: You just |
||||
pick the date, throw in the database, then read it back and everybody was |
||||
happy.</p> |
||||
<p>But things are not like this anymore. People will access your site from far |
||||
away locations, the source of the date may not be in the same timezone of your |
||||
system, your system may be running in a completely different timezone of your |
||||
dev machine (it's pretty common to run things in our machines in the local |
||||
timezone but the production system will run in UTC), the display may be a |
||||
complete different timezone than your production and dev machine and so on.</p> |
||||
<p>So always carry the timezone with the data. Find modules/classes that support |
||||
dates with timezones (a.k.a. make things <em>timezone aware</em>), capture the |
||||
timezone as soon as possible and carry it around in all operations. |
||||
Modules/classes that don't support timezones for dates/times should, as soon |
||||
as possible, removed from the system.</p> |
||||
<p>Any developers a bit more seasoned -- and by "seasoned" I meant "Had to deal |
||||
with times before" -- will probably claim "Hey, this is <em>obvious</em>!" And I'd |
||||
have to agree. But it's annoying how many times I got bitten by some stupid |
||||
bug 'cause we decided that "well, everything is in the same timezone, so it's |
||||
all good".</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/start-stupid">Start Stupid</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/use-utf8">Always Use UTF-8 For Your Strings</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,133 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Always Use UTF-8 For Your Strings</h1> |
||||
<span class="post-date"> |
||||
2019-07-01 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/utf-8/">#utf-8</a> |
||||
|
||||
</span> |
||||
<p>Long gone are the days where <a href="https://en.wikipedia.org/wiki/ASCII">ASCII</a> was |
||||
enough for everyone. Long gone are the days where you can deal with strings |
||||
with no "weird" or "funny" characters.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I became a developer in a time when the only encoding we had was ASCII. You |
||||
could encode all strings in sequences of bytes, 'cause all characters you |
||||
could use where encoded from 1 to 255 (well, from 32 [space] to 93 [close |
||||
brackets] and you still have a few latin-accented characters in some higher |
||||
positions, although not all accents where there).</p> |
||||
<p>Today, accepting characters beyond that is not the exception, but the norm. To |
||||
cope with all that, we have things like |
||||
<a href="https://en.wikipedia.org/wiki/Unicode">Unicode</a> and |
||||
<a href="https://en.wikipedia.org/wiki/UTF-8">uTF-8</a> for encoding that in reasonable |
||||
memory space (UTF-16 is also a good option here, but that would depend on your |
||||
language).</p> |
||||
<p>So, as much as you to make your system simple, you will have to keep the |
||||
internal representation of your strings in UTF-8/UTF-16. You may not receive |
||||
the data as UTF-8/UTF-16, but you'll have to encode it and keep transmitting |
||||
it around as UTF-8/UTF-16 till you have to display it, at which point you'll |
||||
convert from UTF-8/UTF-16 to whatever your display supports (maybe it even |
||||
supports displaying in UTF-8/UTF-16, so you're good already).</p> |
||||
<p>Today, I believe most languages do support UTF-8, which is great. You |
||||
may still have problems with inputs coming from other systems that are not |
||||
UTF-8 (old Windows versions, for example), but that's fairly easy to convert |
||||
-- the hard part is figuring out the input <em>encoding</em>, though. Also, most |
||||
developers tend to ignore this and assume the input is in ASCII, or ignore the |
||||
input encoding and get a bunch of weird characters on their printing, |
||||
'cause they completely ignored the conversion on the output point. That's why |
||||
I'm repeating the mantra of UTF-8: To remind you to always capture your input, |
||||
encode it in UTF-8 and <em>then</em> convert in the output.</p> |
||||
<p>One thing to keep in mind is that UTF-8 is not a "cost free" encoding as |
||||
ASCII: While in ASCII to move to the 10th character, you'd just jump 10 bytes |
||||
from the start of the string, with UTF-8 you can't, due some characters being |
||||
encoded as two or more bytes (you should read the Wikipedia page; the encoding |
||||
is pretty simple and makes a lot of sense) and, due this, you can't simply |
||||
jump 10 characters 'cause you may end up in second byte that represents a |
||||
single character. Walking through the whole string would require traversing |
||||
the string character by character, instead of simply jumping straight to the |
||||
proper position. But that's a price worth paying, in the long run.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/use-timezones">Always Use Timezones With Your Dates</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/optimization">Optimization Is For Compilers</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Think About The Users</h1> |
||||
<span class="post-date"> |
||||
2019-07-17 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/privacy/">#privacy</a> |
||||
|
||||
</span> |
||||
<p>Think how the data you're collecting from your users will be used -- this is |
||||
more prevalent on these days, where "privacy" is a premium.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I once had a discussion with a CTO about collecting the user IMEI on our |
||||
mobile app. Basically, there was no use case for capturing that information |
||||
yet but, as he put at the time, "We may want to know if one user uses two |
||||
phones, or if two users use the same phone". I raised the fact that we didn't |
||||
need this information and, besides that, it felt like we were invading the |
||||
users privacy. He still decided to go ahead. My answer: "I'll do it, but I |
||||
want to point that I'm not happy with it."</p> |
||||
<p>In the end, the store blocked the app... because we were capturing the IMEI.</p> |
||||
<p>But there are cases and cases. If you really <em>really</em> need to capture user |
||||
information, be sure to protect it against unauthorized use, be it by external |
||||
forces (someone found a way to attack your data) or internal (some disgruntled |
||||
colleague decided to take the data from your users with them).</p> |
||||
<p>And be sure, there <em>will</em> be a leak at some point, it's just a matter of time. |
||||
If you can, the best way to protect your users data is to never capture it. |
||||
When a flaw on your system is found or when some colleague leaves the company |
||||
in bad terms, there will be no data to expose to the world, anyway. You can't |
||||
be more secure than this.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/debuggers">Debuggers Are Overrated</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/integration-tests">Unit Tests Are Good, Integration Tests Are Gooder</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,113 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">Things I Learnt The Hard Way - Pay Attention On How People React To You</h1> |
||||
<span class="post-date"> |
||||
2019-07-19 |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/things-i-learnt/">#things i learnt</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/personal/">#personal</a> |
||||
|
||||
<a href="https://blog.juliobiason.me/tags/reactions/">#reactions</a> |
||||
|
||||
</span> |
||||
<p>One way you can learn about yourself is to pay attention on how people react |
||||
to your actions.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>I have a "angry man resting face", which means that, even when I'm in a null |
||||
mood, it looks like I'm angry.</p> |
||||
<p>I already had one meeting and which I started to ask something and noticed |
||||
that the other person move a bit back. That's when I realized that didn't |
||||
sound exactly how I meant. I had to add "I'm not saying what you're proposing |
||||
is wrong, I'm just confused."</p> |
||||
<p>Also, I got a manager once come up with "I thought you were <em>the</em> serious |
||||
person... till you suddenly started singing in the middle of a meeting"<sup class="footnote-reference"><a href="#1">1</a></sup>.</p> |
||||
<p>You need to keep an eye on this. How is people reacting to your reactions? Are |
||||
they opening themselves to you or are they closing?</p> |
||||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup> |
||||
<p>I have this "serious" problem that, depending on the word someone says, |
||||
I recall some lyrics and suddenly start singing it.</p> |
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="/books/things-i-learnt/learn-about-yourself">You'll Learn About Yourself The Hard Way</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="/books/things-i-learnt/hero-syndrome">Don't Confuse Hero Project With Hero Syndrome</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
@ -0,0 +1,105 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">00. Introdução</h1> |
||||
<span class="post-date"> |
||||
2015-12-22 |
||||
|
||||
</span> |
||||
<p>Esta é a parte em que eu explico porque eu escrevi tudo isso e cujo conteúdo |
||||
não vai afetar em nada seu conhecimento de VIM ou a sua vida.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Em 2000 tive meu primeiro contato com programação em Linux e, como era de se |
||||
esperar, o primeiro editor sugerido foi o "VIM".</p> |
||||
<p>Foi WTF à primeira vista (e o clássico "Como é que eu fecho isso?").</p> |
||||
<p><img src="https://blog.juliobiason.me/books/uma-licao-de-vim/00-intro/vim-zero.png" alt="Ok, não é a mesma versão que eu usei a 8 anos atrás, mas a sensação é a mesma." /></p> |
||||
<p>Depois de usar outros editores por algum tempo (<em>cough</em> FTE <em>cough</em>), finalmente |
||||
decidi dar o braço a torcer e passei a usar VIM, continuo usando até hoje. Não |
||||
que eu tenha usado somente VIM desde então, utilizei outros editores (TextMate, |
||||
Sublime Text 2, Gedit) mas eu sempre sinto falta de alguma coisa nos outros |
||||
editores que acabei de acostumando no VIM. E, ainda, VIM ainda é o editor que |
||||
eu mais ouço "Cara, como é que tu fez isso?".</p> |
||||
<p>Não que VIM seja um editor completo e perfeito. Existem coisas novas surgindo a |
||||
todo momento que ninguém sequer imaginava quando VIM foi criado; existem coisas |
||||
que pelas próprias limitações do editor, o VIM não faz. Para algumas dessas, |
||||
existem plugins -- e eu vou falar de alguns interessantes mais pra frente -- e, |
||||
infelizmente, para outras, não há nada que possa ser feito, a não ser saber que |
||||
estas "faltas" existem e estar preparados para elas.</p> |
||||
<p>E vejamos quantos "Cara, como é que tu fez isso?" vão aparecer até o final |
||||
deste livro.</p> |
||||
<div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="./01-modos">Modos</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 41 KiB |
@ -0,0 +1,142 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">01.01. Modo Normal</h1> |
||||
<span class="post-date"> |
||||
2015-12-22 |
||||
|
||||
</span> |
||||
<p>Esta é a parte em que você ainda vai precisar de um arquivo pronto para ver |
||||
as coisas funcionando.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>A apresentação mais clássica do modo normal são todas as demais explicações que |
||||
você vai achar por aí que dizem que é preciso usar <code>h</code>, <code>j</code>, <code>k</code> e <code>l</code> para |
||||
mover o cursor na tela. Tirando o fato que isso é uma balela sem tamanho e que |
||||
o VIM suporta movimentação com as teclas direcionais e que você não precisa |
||||
ficar pensando em mnemônicos como "j tem uma perna pra baixo, k tem uma perna |
||||
pra cima" e outras absurdices, estes são comandos normais válidos: ao |
||||
pressionar <code>k</code>, o cursor irá mover para a linha de cima, <code>j</code> moverá o cursor |
||||
para a linha de baixo e assim por diante.</p> |
||||
<p>Nem todos os comandos são acionados com apenas uma tecla. Alguns iniciam um |
||||
comando, mas ficam esperando mais informações para saber o que fazer ou onde |
||||
fazer. Assim, temos comandos que são de movimentação e outros de ação.</p> |
||||
<h2 id="comandos-de-movimentacao">Comandos de Movimentação</h2> |
||||
<p>Comandos de movimentação são comandos que movem o cursor no texto. Como já |
||||
vimos, <code>h</code>, <code>j</code>, <code>k</code> e <code>l</code> são comandos de movimentação. Além destes temos<sup class="footnote-reference"><a href="#1">1</a></sup>:</p> |
||||
<h3 id="f-letra">f[letra]</h3> |
||||
<p>Posiciona o cursor na próxima <code>[letra]</code> na linha. Se <code>[letra]</code> não existir, não |
||||
move o cursor. Por exemplo, <code>fa</code> irá mover o cursor para o próximo "a" na |
||||
linha.</p> |
||||
<h3 id="f-letra-1">F[letra]</h3> |
||||
<p>O mesmo que <code>f[letra]</code>, mas voltando na linha ao invés de ir pra frente.</p> |
||||
<h3 id="t-letra">t[letra]</h3> |
||||
<p>Posiciona o cursor uma posição antes de <code>[letra]</code> na linha. Praticamente o mesmo |
||||
que <code>f[letra]</code>, mas uma posição antes.</p> |
||||
<h3 id="t-letra-1">T[letra]</h3> |
||||
<p>Assim como "F" faz o mesmo que "t", mas voltando na linha.</p> |
||||
<h3 id="0">0</h3> |
||||
<p>Move o cursor para a coluna 0.</p> |
||||
<h3 id="">_</h3> |
||||
<p>Move o cursor para a primeira letra que não seja espaço ou tabulação na linha.</p> |
||||
<h3 id="-1">$</h3> |
||||
<p>Move o cursor para o final da linha.</p> |
||||
<h3 id="-2">%</h3> |
||||
<p>Move o cursor para o outro elemento do par (por exemplo, % quando cursor |
||||
estiver sobre um "(" irá mover o cursor para o ")" correspondente).</p> |
||||
<p>Até aqui eu acredito que você esteja pensando "nada que mude minha vida". Bom, |
||||
então aqui vem a primeira grande dica:</p> |
||||
<blockquote> |
||||
<p>Se você digitar um número antes de fazer um comando, VIM irá repetir o |
||||
comando quantas vezes o número indicar.</p> |
||||
</blockquote> |
||||
<p><img src="https://blog.juliobiason.me/books/uma-licao-de-vim/01-01-modo-normal/Mind-Blown.jpg" alt="" /></p> |
||||
<p>Ok, talvez não tenha sido a revelação do século, mas isso quer dizer que se |
||||
você digitar <code>3f.</code>, VIM irá mover o cursor para o terceiro ponto na linha atual. |
||||
E isso também pode não parecer importante, mas daqui pra frente isso vai fazer |
||||
sentido.</p> |
||||
<div style="border:1px solid grey; margin:7px; padding: 7px"> |
||||
<p>Todas as imagens são copyright (C) seus respectivos donos.</p> |
||||
|
||||
</div> |
||||
<p><sup class="footnote-reference"><a href="#1">1</a></sup> De forma alguma, esta é uma lista completa de todos os comandos de |
||||
movimentação existentes, apenas os mais interessantes.</p> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="./01-modos">Modos</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="./01-02-entendendo-o-cursor">Entendendo o Cursor</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
After Width: | Height: | Size: 7.1 KiB |
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
||||
|
||||
<!-- Enable responsiveness on mobile devices--> |
||||
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
||||
|
||||
<title>Julio Biason .Me 4.3</title> |
||||
|
||||
<!-- CSS --> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
||||
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head> |
||||
|
||||
<body class=" "> |
||||
|
||||
<div class="sidebar"> |
||||
<div class="container sidebar-sticky"> |
||||
<div class="sidebar-about"> |
||||
|
||||
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
||||
|
||||
<p class="lead">Old school dev living in a 2.0 dev world</p> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ul class="sidebar-nav"> |
||||
|
||||
|
||||
<li class="sidebar-nav-item"><a href="/">English</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
||||
|
||||
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
||||
|
||||
|
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="content container"> |
||||
|
||||
<div class="post"> |
||||
<h1 class="post-title">01.02. Entendendo o Cursor</h1> |
||||
<span class="post-date"> |
||||
2015-12-22 |
||||
|
||||
</span> |
||||
<p>Esta é a parte em que você vai lembrar quando o texto não parar exatamente |
||||
onde você pensava que ele iria parar.</p> |
||||
<span id="continue-reading"></span> |
||||
<p>Antes de passar para comandos do modo normal que realmente alteram o texto, é |
||||
preciso entender como o VIM entende o cursor, porque o funcionamento pode |
||||
parecer um pouco diferente dos demais editores.</p> |
||||
<p>Para todos os efeitos, considere que o cursor está sempre na parte inferior |
||||
esquerda do bloco do cursor.</p> |
||||
<p><img src="https://blog.juliobiason.me/books/uma-licao-de-vim/01-02-entendendo-o-cursor/vim-cursor.png" alt="" /></p> |
||||
<p><img src="https://blog.juliobiason.me/books/uma-licao-de-vim/01-02-entendendo-o-cursor/areyoufuckingkiddingme.jpg" alt="Mais uma foto de você, nesse exato momento." /></p> |
||||
<p>Porque é importante ter isso em mente?</p> |
||||
<p>Porque a maior parte dos editores trata as coisas um pouco diferentes: Por |
||||
exemplo, se houver uma linha inteira no clipboard, o VIM irá inserir (com o |
||||
comando padrão de colar, que vamos ver mais adiante) a nova linha abaixo na |
||||
linha atual -- a maior parte dos outros editores cola a nova linha no lugar da |
||||
linha atual e move a antiga linha uma posição abaixo.</p> |
||||
<p>Apenas tenha isso em mente agora que vamos começar a mudar de modo e alguns |
||||
comandos consideram a posição do cursor desta forma e tem uma "contraparte" |
||||
para ações antes do cursor -- e por isso o próximo capítulo parece ter comandos |
||||
repetidos.</p> |
||||
<div style="border:1px solid grey; margin:7px; padding: 7px"> |
||||
<p>Todas as imagens são copyright (C) seus respectivos donos.</p> |
||||
|
||||
</div> |
||||
<div> |
||||
|
||||
<div style="float:left"> |
||||
<< <a href="./01-01-modo-normal">Modo Normal</a> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div style="float:right"> |
||||
<a href="./01-03-modo-de-insercao">Modo de Inserção</a> >> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
</body> |
||||
|
||||
</html> |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue