I’m very happy to be a guest speaker at QCon Beijing in April 2012.
I submitted the 2 abstracts below. We haven’t agreed completely on the schedule, but it seems like one of them will be a half-day tutorial (Shallow Depth of Tests) and the other one a talk (Predictably and Irrationally Agile).
Shallow Depth of Tests - Scalable TDD/BDD
Test automation is prevalent in the software development community. Practices like TDD and BDD are widespread and applied almost unquestionably. However, several organisations have struggled in attempting to scale automated test suites, which very often become slow, brittle, non-deterministic, unreliable and difficult to maintain.
In this talk, I will discuss some common mistakes, Tautological TDD (TTDD), for example, and also present patterns that I have successfully applied, such as Shallow Depth of Tests and Testing Pyramid. These have enabled us to achieve maintainable and scalable tests that fulfill their purpose - to help software development teams deliver faster and more confidently the features required by business people.
Predictably and Irrationally Agile
People behavior is one of the centerpieces of Agile software development. Cognitive Psychology and Behavioral Economics have helped us achieve a better understanding of some human seemingly idiosyncratic behaviors, for example, the decoy effect on the decision-making process. Agile teams are constantly making decisions, for instance, while prioritising, estimating stories or choosing the size of an iteration.
This talk will compare and correlate Dan Ariely’s controlled experiments described in his book “Predictably Irrational” to Agile. The anticipated result should be an increased awareness of the reasoning behind some Agile values, principles and practices which, as a consequence, should improve the way we apply them as agile adopters and practitioners.

A little bit of history: For the past two years I have participated directly in 3 Inceptions, and indirectly in 5 inceptions. By directly, I mean, I was sitting in the war room for most of the Inception sessions. And by indirectly, I mean, I was participating on the Inception sessions over video from a Nearshore location (onshore is San Francisoc, USA, nearshore is Porto Alegre, Brazil).
I attribute the success of the last Agile Inception to 3 things: collocation, war room, and colorful post-it.
Collocation
Don’t under estimate the value of a face to face interaction. I am currently in Brazil and I am used to having effective meetings over video and phone with USA. I know that technology can bring people closer together, and, perhaps, we can work together without sitting next to each other. However, the face to face during Inception will bring the team together in a way that it will be worth each penny spend for making the collocated Inception a reality.
I compare it to dating and internet dating. Relationship development goes to another level when the whole team is at the same room. Think creatively on how to save on costs. In our case we were able to reduce the collocated period by having a pre-Inception period before the collocate Inception. Spikes, research, data gathering, codebase analysis were the sort of activities we did in the pre-Inception week.
War room
Keep a single room for the team during the intense Inception period: the war room! The room should fit all team comfortably. It must have a clean table and wall space. The room should also have a cabinet or a box with index cards, colorful post-its and pen.
The war room makes the environment for collaborative sessions. It also avoids the waste of time of people moving from one room to another. Another important point is about carrying the information between rooms. You can either carry all hand-written notes (index cards, post-its, flip-charts, etc) and put them back in the wall and tables, or upload them on a digital format and carry it on your laptop. The former option is a waste of time. The later lessens people interaction. There is no replacement for writing on and tearing apart colorful post-it or index cards. Once the information goes to the computer, it will not get back to paper. People interaction reduces as there is nothing on the table to gather around.
colorful post-its
Do not bring a list of existing user stories to the Inception. I am sure there is a list somewhere (excel, Jira, or alike). Use it for reference, but don’t use it for driving the Inception sessions. Print a few copies and bring them to the war room. Let people consume it if required. Try not to read items from a list during a collaborative session. In fact, do not build a list while in a collaborative session.
Group people around colorful post-its. Write and place post-its either on the table or at the wall.. Talk about them. Write a few more. Tear them apart. Make use of colors. Reorganize it. The collaboration from using such basic, low-fi technology— colorful post-its and pen—cannot be matched by any digital alternative (file sharing, projector, spreadsheets, etc).
The picture below depicts a great example from my last Inception. Without a previous encoding, the team decided to use the colored small post-its for personas. User Stories (in green post-its) were placed on white index cards containing numbers and estimated (with notes on the back).
On future posts: user story mapping for driving Inception, and a few notes on Inception facilitation
I would like to share a script to rename all fields in a collection. It can be used to update field values, as well.
var collections = db.getCollectionNames()
collections.forEach(function(collectionName) {
var collection = db.getCollection(collectionName)
collection.update ( {}, { $rename : { "oldFieldName" : "newFieldName" }} );
});
The team members talked over a phone bridge (skype or similar would work as well).
Google Drawing was used to collect data on the main data gathering exercise for the retrospective.
Here is the picture generated at the end of the retrospective.
How did I use Google Drawing?
Simple is good!
The only problem we faced: a few of us got an error message when creating a text box (I believe this was due to all 10 team members creating text boxes at the same time). But this only happened a few times. A simple refresh took the problem away.

A little bit of history: For the past two years I have participated directly in 3 Inceptions, and indirectly in 5 inceptions. By directly, I mean, I was sitting in the war room for most of the Inception sessions. And by indirectly, I mean, I was participating on the Inception sessions over video from a Nearshore location (onshore is San Francisoc, USA, nearshore is Porto Alegre, Brazil).
I attribute the success of the last Agile Inception to 3 things: collocation, war room, and colorful post-it.
Collocation
Don’t under estimate the value of a face to face interaction. I am currently in Brazil and I am used to having effective meetings over video and phone with USA. I know that technology can bring people closer together, and, perhaps, we can work together without sitting next to each other. However, the face to face during Inception will bring the team together in a way that it will be worth each penny spend for making the collocated Inception a reality.
I compare it to dating and internet dating. Relationship development goes to another level when the whole team is at the same room. Think creatively on how to save on costs. In our case we were able to reduce the collocated period by having a pre-Inception period before the collocate Inception. Spikes, research, data gathering, codebase analysis were the sort of activities we did in the pre-Inception week.
War room
Keep a single room for the team during the intense Inception period: the war room! The room should fit all team comfortably. It must have a clean table and wall space. The room should also have a cabinet or a box with index cards, colorful post-its and pen.
The war room makes the environment for collaborative sessions. It also avoids the waste of time of people moving from one room to another. Another important point is about carrying the information between rooms. You can either carry all hand-written notes (index cards, post-its, flip-charts, etc) and put them back in the wall and tables, or upload them on a digital format and carry it on your laptop. The former option is a waste of time. The later lessens people interaction. There is no replacement for writing on and tearing apart colorful post-it or index cards. Once the information goes to the computer, it will not get back to paper. People interaction reduces as there is nothing on the table to gather around.
colorful post-its
Do not bring a list of existing user stories to the Inception. I am sure there is a list somewhere (excel, Jira, or alike). Use it for reference, but don’t use it for driving the Inception sessions. Print a few copies and bring them to the war room. Let people consume it if required. Try not to read items from a list during a collaborative session. In fact, do not build a list while in a collaborative session.
Group people around colorful post-its. Write and place post-its either on the table or at the wall.. Talk about them. Write a few more. Tear them apart. Make use of colors. Reorganize it. The collaboration from using such basic, low-fi technology— colorful post-its and pen—cannot be matched by any digital alternative (file sharing, projector, spreadsheets, etc).
The picture below depicts a great example from my last Inception. Without a previous encoding, the team decided to use the colored small post-its for personas. User Stories (in green post-its) were placed on white index cards containing numbers and estimated (with notes on the back).
On future posts: user story mapping for driving Inception, and a few notes on Inception facilitation
Log4J can easily send e-mail notifications every time an error occurs. It is particularly interesting and a very powerful functionality for production environments. However, the default SMTPAppender lacks support for SSL enabled SMTP servers and it is also not easily configurable according to the environment.
This is an enhanced version of the Original SMTPAppender, which supports SSL and is environment aware.
package com.dattein.logging;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import java.security.Security;
import java.util.Properties;
public class SMTPAppender extends org.apache.log4j.net.SMTPAppender {
public SMTPAppender() {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
}
@Override
protected boolean checkEntryConditions() {
//Obviously you have to use your own environment aware mechanisme, instead of the line below
return Environment.isProduction();
}
@Override
protected Session createSession() {
Properties properties = new Properties();
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.host", getSMTPHost());
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", getSMTPPort());
properties.put("mail.smtp.socketFactory.port", getSMTPPort());
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.socketFactory.fallback", " false");
properties.setProperty("mail.smtp.quitwait", " false");
Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(getSMTPUsername(), getSMTPPassword());
}
});
return session;
}
}
That is how you use it:
"/>
"/>
If you are wondering how to activate the Amazon SES SMTP server, check this out:
https://console.aws.amazon.com/ses/home#smtp-settings:
Mando alguns resources.
Conceitos de REST?
Importante ler sobre o material de Roy Fielding. E olhar o material sobre REST da Wikipedia.
Outro artigo é o que saiu na InfoQ. Tem tradução na InfoQ Brasil.
Livro?
Indico o Rest in Practice, do Jim Webber.
Exemplos de API para trabalhar com o REST? As APIs listadas abaixo são em alguns casos baseadas nos conceitos de REST, mas já vão ajudar em muito.
Ferramentas para trabalhar?
Vou indicar apenas duas:
In the software development business there’s some well known currencies, these currencies are used to value an employee and the employee (dev, architect, QA or manager) struggle to achieve them as they make their employment more stable or more profitable, this fact goes probably for all work environments. Some more common is productivity (whatever way it’s measured), proactivity, efficiency, leading, domain knowledge. Whatever the company values the employee will try to make himself/herself good at it.
Companies, whatever they value, have to pay attention to these values, misunderstanding what they mean and evaluating it wrong will lead to employees behaving as they’re measured, which it turns out not to be the value glued in a beautiful frame on the wall.
One in particular that I want to focus is “domain knowledge”. I’ve seem much misunderstanding of this skill inside big companies. Let’s say that you work on a big company that develops software. Some old time folks would be considered valuable because the have a lot of “domain knowledge”, which usually translates in knowing the technology stack and how it works and its implementations, that’s supposed to be good, right?
An employee with this kind of knowledge is essential to help new comers to understand what is happening and how to deal with the application, how to improve it without breaking it and how to modify it. This is a good thing and companies are right to be worried about retaining such employees.
Gaming the system is easy though. This is where I find hard to deal with in legacy systems. Much of the systems that I saw are not so complex in essence but they are a bad coded software. Domain Knowledge experts know the way around it because they wrote the thing in first place but often do not know the business concerns behind it. It turns out that this “domain knowledge” is just a background of the past bad code written.
In such situations two wrongs do not make a right, bad code is bad code, knowing how was written doesn’t make an expert it is just half of the knowledge needed, it is still missing the knowledge of the problems the software was trying to solve. I expect from an expert to know the problem and the current solution and be able to discuss new solutions for the same problems as well find out other problems. Companies have to be aware of that otherwise employees regarded as experts might be only gaming the system and holding the company back on innovative solutions.
Since May of 2009 I’m playing as CIO / CTO for Trevisan Tecnologia, a mobile development company located in the south of Brazil.
My mission here is to create a new culture and help grow the company teams to enable the creation of new products. When I say culture I mean creating a Learning culture based on Lean and Agile practices. Our team is growing a lot and will keep growing. When I say new products, I’m saying Lean Startup style.
Today is a great day. uMov.me is completing 1 year after public release. uMov.me is a mobile platform that enables companies to deliver quality corporate mobile apps faster to the market. It’s simple, fast to develop, and you can find what you need to develop corporate mobile applications.
The good thing is to look back and see amazing things our team done, not only technically but also looking at the product itself. I’m proud to be part of this team.
We have published an infographic telling a bit of the story of this past year.
OS X launchd spawn processes and manage them, you can actually make use of it to help you out on OS X automation. I had the same exactly thought that Diego Zamboni had when wrote this blog post four years ago.
QuickSilver became part of my interactions with OS X for a while but QS is not perfect and sometimes crash or needs to be restarted. As Diego felt, I felt that when QS quits is annoying go chasing it again to restart it. For this launchd can help you.
Start by disabling the Start at Login option of QS in its preferences.
After that adding the below XML as ~/Library/LaunchAgents/com.blacktree.Quicksilver.plist will do the trick of keep QS running, if it quits, it will be restarted automatically.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.blacktree.Quicksilver</string>
<key>LimitLoadToSessionType</key>
<string>Aqua</string>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Applications/Quicksilver.app/Contents/MacOS/Quicksilver</string>
</array>
</dict>
</plist>
You can check the this Technical Note for a lot of details. But I will give a short explanation of what we have here.
Label – It’s mandatory to identify the job and has to be unique, it has to match the file name (without the suffix .plist)LimitLoadToSessionType – The context the job should run, Unix fellows this is similar to run levels. The value of Aqua means full GUI.ProgramArguments – Is actually what we want to run. Check the man launchd.plist and execvp(3) on the Terminal for more information.That’s it, log out and log in back again and you should see QS running. If you want to test if launchd is managing your QS just quit it and you should see it running back again.
Recently I got a new Mac and setting up for development is always fun, so I decided share some of the setups I do on a new Mac.
Is a Mac a good machine for development?
I think so and also know folks that think Linux is better, some are more use to Windows. In the end I think is not the OS which makes a better development machine (although there’s space for some debate here) but how you deal with it. Take a look on The Productive Programmer by Neal Ford for some other tips.
What to keep in mind
As you setup a machine for development some things you should keep in mind. First is you want to lower the keyboard to mouse time. Taking your hands off the keyboard to point to a link in a webpage and then going back is time consuming, a developer goes from the IDE to the browser lots of time during the day.
Make the computer do what you’re thinking without much effort, few keystrokes should take or do what you want. Going through menus, mouse, chasing windows on the desktop are also time consuming, unproductive and (for me) annoying.
If you do twice, think about how to do with one keystroke. If you caught yourself repeating something, think in a way to automate it (if makes sense). Apple has AppleScript and Automator which you can use to make simple scripts for mundane things.
Keep your projects and files organized, this goes for every developer. Not knowing where the files are leads you to browsing around to find them, avoid that. I have a Projects directory and an alias gp that goes to this folder, plus gp project takes me direct to the project folder. If you have some suggestion please do so (use the comments), I’m keen to know how you make your environment more smart and fast.
Now, some of the things I do on my Mac for development.
Disabling the Dashboard
I tried to use, make some meaningful use of it but never achieved, it just sit there. In Lion it turned to be a little more annoying as it shows on Mission Control view. Disabling the Dashboard is pretty easy, go to the terminal and issue this command:
defaults write com.apple.dashboard mcx-disabled -boolean YES
And restart the Dock:
killall Dock
Get iTerm 2
OS X has its Terminal application but iTerm 2 has some features that I really like, one is the Hotkey Window which you can trigger by a keyboard shortcut and it come and goes easily.
One tip for Lion users, if you use multi desktops set iTerm 2 to be available in All Desktops. You can achieve this by control + click on iTerm icon in the Dock and selecting Options – Assign To – All Desktops. This way when you invoke Hotkey Window it will not shift from desktop to desktop.
Get QuickSilver
QuickSilver is a very powerful application for action at distance. Some of you might know Alfred (check the app store), in Linux the Gnome Do and on Windows I recall Launchy.
On a Mac I prefer QuickSilver, mind that it is not just a Application launcher it can do a lot more than launch applications.
Get Dropbox
I use dropbox for a lot of file transferring and storage, specially when I change machines it helps to avoid the USB stick protocol.
Get Caffeine
A development machine that keeps dimming the monitor, going to screensaver and sleeping because you took more than five minutes to type doesn’t help you. Caffeine when on don’t let this happen, it’s way more easy than changing Energy Saver configurations.
Get iStat Menus
This one is paid. I use to keep and eye on CPU, Memory, Hard drive access and Network usage. Also it can replace the battery level indicator and the date menu on the Mac. This is a habit that I’ve acquired working with Linux for long time and Bubblemon.
Get Xcode
Although I don’t develop for Mac, Xcode is needed because it brings a lot of libraries for development that it’s needed for a dev.
Get Home Brew
Or another package manager for Mac as MacPorts. You will need to install other packages into your Mac. Unless you’re a fan of compiling everything you need something similar to apt-get to your Mac.
Get GleeBox
I can’t image myself using a browser without GleeBox. It makes easier to find links, form items, issue bookmarkslets on a page and more. Is one more application to lower the keyboard to mouse time.
Turn on keyboard access to all controls
In the System Preferences go to Keyboard then keyboard shortcuts and turn All Controls. Now you can use tab to navigate through windows buttons and fields.
If you use Safari, turn “Tab” for links
It doesn’t come with the “Tab” to links enabled by default, just to go to its preferences advanced and turn Press Tab to highlight each item on a webpage.
Get a real Text/Code editor
I use Vim and usually is the first thing that I install in any computer that I use. MacVim is the Vim for a Mac. Also I don’t like the menu if you also don’t like add to your ~/.gvimrc:
set guioptions=-T
Learn some common shortcuts of OS X
One of the good things about Apple software is it tries to be consistent over the keyboard shortcuts. The famous Command + , in almost every software that runs on a Mac takes you to the preferences of the app.
Another good one is Command + ? which takes you to the help menu, plus there’s a search that can show you a entry on the menu. If the app doesn’t not provide a shortcut for the action you’re trying to make you can use this one to go there.

@Test
public void someTest() throws Exception {
WebElement userNameField = driver.findElement(By.name("j_username"));
userNameField.sendKeys(username);
WebElement passwordField = driver.findElement(By.name("j_password"));
passwordField.sendKeys(password);
WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));
//asserts
}
@Test
public void someTest()throws Exception {
loginPage.open();
loginPage.logon(properties.getUsername(), properties.getPassword());
//asserts
}
public void logon(String username, String password){
String username = readUsernameFromFixture();
String password = readpasswordFromFixture();
WebElement userNameField = driver.findElement(By.name("j_username"));
userNameField.sendKeys(username);
WebElement passwordField = driver.findElement(By.name("j_password"));
passwordField.sendKeys(password);
WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));
logonButon.click();
}

package br.com.bright.halfprehalfpospaidapplication.test.online;
...
imports...
...
@ContextConfiguration(locations = "/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class ExpireNoUsedCreditsFunctionalTest {
@Autowired
private LoginPage loginPage;
@Autowired
private HomePage homePage;
@Autowired
private ViewMobilePage viewMobilePage;
@Autowired
private ViewMobileResultPage viewMobileResultPage;
@Autowired
private AuxiliaryClassToCheckDataBase akaDaoOrRepository;
@Autowired
private MenuPage menuPage;
@Autowired
private Properties properties;
private Integer statusBeforeTest;
private Integer codeUnderTest;
@Before
public void setUp() {
statusBeforeTest = null;
codeUnderTest = null;
}
@After
public void tearDown() {
if (statusBeforeTest != null) {
akaDaoOrRepository.updateStatusByCode(statusBeforeTest,
codeUnderTest);
}
menuPage.Logoff();
}
@Test
public void noCreditsToRevert() throws Exception {
...
package br.com.bright.thesameapplication.test.online.page;And in order to inject the WebDriver in the constructor as a dependency we need it to be a Spring Bean as well, but you cannot annotated it as we just downloaded the WebDriver's jar. To solve that we will use the xml piece. Check this out:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LoginPage extends PageBase{
@Autowired
public LoginPage(WebDriver webDriver) {
super(webDriver);
}
public void logon(String username, String password){
WebElement userNameField = driver.findElement(By.name("j_username"));
userNameField.sendKeys(username);
WebElement passwordField = driver.findElement(By.name("j_password"));
passwordField.sendKeys(password);
WebElement logonButon = driver.findElement(By.xpath("/html/body/center/table/tbody/tr[2]/td/form/input"));
logonButon.click();
}
}
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
The WordPress.com stats helper monkeys prepared a 2011 annual report for this blog.
Here’s an excerpt:
A New York City subway train holds 1,200 people. This blog was viewed about 5,700 times in 2011. If it were a NYC subway train, it would take about 5 trips to carry that many people.
Click here to see the complete report.
Então, dias 26 e 27 de agosto ocorreu o É dia de Java 2011, evento realizado na UFSCar junto com a galera do SouJava. Eu tive duas participações no evento, primeiro fazendo o workshop “Da visão a Produção” na sexta-feira a noite. Depois do workshop fui fazer um lanche com Fabio Velloso, Wagner Santos e Dalton Stoqui, e infelizmente foi a primeira vez que eu perdi para um Xis/Bauru/Sanduiche. No sábado fui palestrar sobre métricas, com uma palestra chamada “Da métrica a diversão“. Os fontes usados como base estão aqui no github.
Em novembro de 2011 estava grande a expectativa pelo Java One Latin America. E quando saiu a lista de palestrantes aceitos, lá estava eu! Tive a oportunidade de falar sobre eXtreme Programming, integração e entrega contínua de produtos. Falei sobre diversos tópicos, sobre a importância de termos feedback do nosso cliente sobre o que está sendo desenvolvido, sobre Lean Startup, sobre práticas do eXtreme Programming e depois mostrei alguns exemplos de como podemos “ganhar” em produtividade de deploy de aplicações. Mostrei um exemplo de script Ant fazendo a automação para deploy de um aplicativo no TomCat 7, rodando antes disto uma série de ferramentas para apoio a automação, com testes e auditoria de código. Em outro exemplo, mostrei um aplicativo feito com Play Framework, fazendo deploy no Heroku. Mais sobre a palestra:
Integração e entrega contínua de produtos? Que venha o eXtreme Programming!
Ser capaz de realizar um deploy de forma contínua não requer apenas habilidades no processo de deploy. E não tem nada a ver com reações rápidas a mudanças ou iterações curtas. Tem a ver com prevenção e aplicação de práticas de engenharia de software efetivas. O objetivo desta palestra é falar como as práticas do eXtreme Programming podem ajudar times Java a alcançarem a qualidade de código necessária para que se possa liberar software em produção de forma contínua e segura. Veremos ferramentas opensource, métricas, automação e riscos minimizados. Com participação da equipe toda e melhoria contínua. Lembre-se: entregar software em produção, para fazer bug fix / patching, não é entrega contínua. É bagunça generalizada, que pode ser evitada.

E para fechar 2011, fizemos a “reativação” do RSJUG, o Grupo de Usuários Java do Rio Grande do Sul. Com o apoio de Leandro Nunes, fizemos um evento fazendo um repeteco da minha palestra do Java One Latin America e depois um bate papo para entender como a comunidade do Rio Grande do Sul pode voltar a fazer eventos e criar novas ações. Fizemos uma relação de atividades que poderão ser desenvolvidas em 2012.
This is more a note to self than a full post. This week I’ve been configuring my new laptop and again I had to configure the PATH variable for some applications and scripts.
Usually you will create a .bash_profile at your home folder and change the PATH like this:
PATH=~/bin:/some/new/application/bin:${PATH}
export PATH
Two simple Bash functions can make this more elegant, I have:
unset partial_path
_push_to_path () {
if [ -z ${partial_path} ]; then
partial_path=${1}
else
partial_path=${partial_path}:${1}
fi
}
_export_path () {
export PATH=${partial_path}
unset partial_path
}
And then you can on your .bash_profile:
_push_to_path "~/bin" _push_to_path "/some/new/application/bin" _push_to_path $(launchctl getenv PATH) _export_path
This is a little more organized and easy to maintain. Note the last line, on OS X you can add back the system path by asking launchctl to give you the system environment entry for PATH.
That’s it.
He also talks about the Agile process micromanagement. Experiencing both worlds, waterfall and agile as a developer and a manager. I have a strong opinion about it. Agile is all about micromanaging!
Consider these:
The more I think about it, the clear it is to me: Agile is all about micromanagement. The good or bad depend on how people adopt its principles and practices. I have experienced many benefits that come from such micromanagement. In fact, when I look back at all projects I participated on, the projects I consider more successful (people enjoying working, delivered great products and improving the work process) are the ones with lots of micromanagement.