Sunday, September 25, 2011

Project 2, going to be here a while

The learning curve was tremendous. Learning an older version of Rails, learning the monkeypatches on it, learning how to deal with metaprogramming from a refactoring perspective. Learning a new editor (SUblime, which I've grown to like quite a bit for dealing with really large files)

Learning about the team, and the team's customs (Jukebox for music was an interesting one...)

Environment issues, DNS server issues, lots and lots of Redis/resque issues.

Learning to take notes in a notebook rather than in evernote

Learning to take hipster jokes with grace and style- or at least without devolving into Godwin's law.

Reading innumerable books on the train.

Meetups- Ruby, Clojure, JavaScript, female developers (sorely needed), ChiSC (discontinued?)...

Setting up Bundler for a largish established app with custom local gems

Tuesday, May 31, 2011

Project 1, rolled-off.

Friday was my last day on my first TW project. What have we learned?

Handover is very important, but with practice it can be done well with little effort. One centralized repository for knowledge is good, although in this case it's more like a combination of Mingle and direct email.

Turning a temporary build server off and back on again will teach you everything about how to set up new ones- also, where the script to do it is. Scripts are wonderful. I think that automating everything using Puppet would be even more wonderful.

Servers without enough space on them are an enormous nuisance when testing giant data import tasks. How to fix this: ask nicely. Also, back channels of communication.

Never assume that you know what an error message means (in Resque tasks, one task can fail because of a parsing error, without the rest of them failing. This happens when there is a small anomaly in the data. You don't need to fix the anomaly in order to finish running the test.)

Developers (well, me) are much happer when they get comfortable chairs, and floors with no holes for chairs to fall into.

git:// vs git@ is an important distinction: the first one gets a read-only copy, the second gets read-and-write. Your build server needs the first one, your development machine needs the second one. The second one throws interesting authentication errors against some firewalls. (I haven't figured out exactly what happened there yet.) When git clone fails and you're in a hurry, you can just scp over the most recent version from a different machine. This is deeply suboptimal because git pull will fail either consistently or sporadically, depending on your firewall configuration.

The db/data directory in a rails app is my favorite because you can auto-generate rake data import tasks by putting things in it.


RHEL (RedHat) 5.5 has no package for git. Use wget, configure, and make. Pick your favorite package version. http://kernel.org/pub/software/scm/git/


Always put your hardware diagrams and reference scripts in the repository. 


If you have problems with unstable commits, label the obviously unstable and obviously stable ones. Git tag is a great command. 


Making a diagram of iOS certificate signing is difficult, can be done in many different ways, and although ideally it would explain itself that is so far not the case; it's just a very useful visual aid to a question-answer session.

Mongo shell is a lot of fun.

Hotdogging someone's computer by making it easy to lock the screen is acceptable. On OSX, do this by:
System Preferences, desktop/Screensaver/, hot corners, put display to sleep (in one of them). Then, System Preferences, Security, Require password immediately after sleep or screensaver begins.
"Hotdogging" is a colloquial term for "doing something to an unlocked computer to point out to the owner of that computer that they shouldn't leave their computer unlocked"

If you have trouble hearing on the phone, there are several easy partial fixes:
  1. use Skype (better sound quality)
  2. email the topics that you heard discussed to someone that was also on the call and ask them to fill in gaps
  3. get a hearing test 

Evernote will take over your life and become your primary external brain storage, but it will make you soooo on top of things. So it might be worth it. I would recommend using the opensource clone Nevernote instead; it has cooler features.

Pre-built secure RPMs exist (you'll probably want to make them yourself?) and you use them for your production machines. To prevent surprises, also use them in advanced testing.


Screenshots are beautiful, essential things when you are working in distributed teams. They reveal communication empty spots which you might have otherwise discovered at a less convenient time. Send them daily. Request them daily. They don't have to be fancy.

Rands in Repose wrote a very excellent book called Managing Humans and as a developer I enjoyed reading it; it discusses some very useful things about communication styles which were directly relevant to things I was having trouble with. (See above re: phone calls and distributed teams)

Tuesday, April 19, 2011

"Why do I need to restart my iPad to install this app?"

I have no idea, but it's happened to me... development apps signed with correct UDIDs. 

Sunday, April 3, 2011

What are you doing in there?

My first few weeks at ThoughtWorks have been interesting. When I first got back from India, I spent a weekend as a jetlagged zombie thanks to the 12.5 hours of time difference, but by Monday I was mostly functional and by Tuesday I was good to go.

My first Monday back in the USA I went in to the office, met up with my fellow Chicagoans from TWUXX, and had a series of chats with various people about our experiences and our future assignments. For a week, we mostly sat at the beach (a table where people not on assignment tend to sit... it has a palm tree ^.^) We spent some time looking at making a command-line interface for Mingle. It was all our own project, and we didn't make that much headway, although I learned a lot of interesting things about the structure of Ruby gems.

On the second week we worked on a small Rails app with some interesting algorithm problems- this was an assignment, not just a project that we happened to be working on. We were trying to refine the theory behind some not completely understood complexities in the algorithms. Around the middle of the week, I was taken off the project, so I didn't get to see the delivery of the first iteration... but I hear it was good!

I was now shadowing DevOps on a project in Chicago. I experienced conceptual overload several times in my first day there... not only did I learn about new tools, I learned about new concepts and new fields of thought. I enjoyed it very much.

I learned about the brother build systems Hudson and Jenkins and how they were different from Go/CruiseControl, and servers and server structure and I had my first introduction to CentOS, which is a clone of RedHat. I learned how Selenium, a web application testing system, can be run headless on servers. I began to increase my understanding of the structure and means of manipulating of firewalls.

I learned more about databases and mySQL, as well as becoming competent with ssh keys and server access. I learned which directories (on the servers for this particular project) were used for what. I gained an understanding of the complicated filetree of the repository containing the code that our servers were running. I learned what JIRA is (bug/request tracking software), and how useful they can be... and how many fields there are to fill out!!

After some time, I was given a new assignment, in a nearby location... as a DevOps person in my own right, setting up a simple build system. Now I'm learning to use Frank, which is similar to Selenium but for testing iOS applications.

Not only that, but in my copious spare time, I'm working with XNA 4.0 and I've been reading up on the OpenKinect library with an eye to doing something cool. In my personal spare time I've been trying to get my laptop to detect and understand the input from my SparkFun RFID kit, but it looks like I'll need to use Windows unless I discover something new.

Also I bought a new phone, a G2, and I'm enjoying learning my way around its interface and playing with apps. 

Friday, April 1, 2011

installing git on CentOS 5.3

(required in order to get many many other useful things)

sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
sudo yum install git

that link will change depending on your version of CentOS, and of course it changes over time. Look it up at https://fedoraproject.org/wiki/EPEL

Thursday, March 17, 2011

VIrtualBox fullscreen: my favorite guide

http://digitizor.com/2009/05/26/how-to-install-virtualbox-guest-additions-for-a-linux-guest/

Thursday, March 3, 2011

gem list error

I've been getting this error frequently during or after running a process which uses Ruby intensively. So far I have no solution other than restart. It also affects all other gem commands, including gem --version.

$ gem list
line 5: [path]: Argument list too long
line 5: [path]: Unknown error: 0

I'm still looking into how to fix this.

Tuesday, March 1, 2011

Run mysql script from command prompt


mysql -u [username] < path/[filename.sql]

Friday, February 25, 2011

add "mate" to your path in OSX (to call TextMate)

To add "mate" to the path of OSX (i.e TextMate) you could do stuff in the terminal, or you could do 
Help > Terminal Usage > Create Link

and achieve the same result. Sometimes the GUI is useful. 

on the beach

I'm in Chicago, on the "beach" with some other TWUXXers getting our environments set up for next week, when we're on a small project spike... using Rails 3.0, JBehave, some other stuff...

On an unrelated note, I'm trying to get Bugzilla installed and configured. Conclusion: why are we using this anyway?

I went to a RoR101 session at lunch today... was interesting but the audience was very diverse in knowledge level.

The grocery store convenient to the Aon center is http://www.bockwinkels.com/

installing BugZilla



http://bugzilla.darwinports.com/
http://www.bugzilla.org/docs/2.18/html/installation.html

First, install MacPorts
go to /opt/local/bin
install https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719 <- must be registered as a dev w Apple to do this
sudo port install bugzilla
run the ./checksetup.pl file is in /opt/local/www/Bugzilla
follow instructions... 
current error: Error in tempfile() using data/params.XXXXX: Parent directory (data/) does not exist at Bugzilla/Config.pm line 313
way to solve this error: follow the instructions in 5. in QUICKSTART and create the database
(I haven't solved this yet)

  1. get appleid
  2. get xcode and therefore db46
  3. continue installing bugzilla


Configuring db46
Error: db46 requires the Java for Mac OS X development headers.
Error: Download the Java Developer Package from: <https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719>
Error: Target org.macports.configure returned: missing Java headers

http://comments.gmane.org/gmane.os.apple.macports.user/22266
"Apple's most recent security update prior to Mac OS X 10.6.5 (presumably included in 10.6.5 also) deletes a file that was previously part of the OS, and is now only part of that development package. We don't know why Apple made this change, only that db46 and a handful of other ports break without it, so we detect this and advise you how to fix it."

http://yoodey.com/how-fix-db46-problem-macport-installation-or-install-db46-mac-os-x-1065



Bugzilla Quick Start Guide 
==========================
(or, how to get Bugzilla up and running in 10 steps)
Christian Reis <kiko@async.com.br]]>

This express installation guide is for "normal" Bugzilla installations,
which means a Linux or Unix system on which Apache, Perl, MySQL or PostgreSQL
and a Sendmail compatible MTA are available. For other configurations, please
see Section 4 of the Bugzilla Guide in the docs/ directory. 

1. Decide from which URL and directory under your webserver root you
   will be serving the Bugzilla webpages.

2. Unpack the distribution into the chosen directory (there is no copying or
   installation involved). 

3. Run ./checksetup.pl, look for unsolved requirements, and install them.
   You can run checksetup as many times as necessary to check if
   everything required has been installed.

   These will usually include assorted Perl modules, MySQL or PostgreSQL,
   and a MTA.

   After a successful dependency check, checksetup should complain that
   localconfig needs to be edited.

4. Edit the localconfig file, in particular the $webservergroup and 
   $db_* variables. In particular, $db_name and $db_user will define
   your database setup in step 5.

   If you want to change platforms, operating systems, severities and
   priorities, this can also be done in localconfig at this time.

5. Using the name you provided as $db_name above, create a MySQL database
   for Bugzilla. You should also create a user permission for the name
   supplied as $db_user with read/write access to that database.

   If you are not familiar with MySQL permissions, it's a good idea to
   use the mysql_setpermission script that is installed with the MySQL
   distribution, and be sure to read Bugzilla Security - MySQL section
   in the Bugzilla Guide or PostgreSQL documentation.

6. Run checksetup.pl once more; if all goes well, it should set up the
   Bugzilla database for you. If not, return to step 5.

   checksetup.pl should ask you, this time, for the administrator's
   email address and password. These will be used for the initial
   Bugzilla administrator account.

7. Configure Apache (or install and configure, if you don't have it up
   yet) to point to the Bugzilla directory. You should enable and
   activate mod_cgi, and add the configuration entries

        Options +ExecCGI
        AllowOverride Limit 
        DirectoryIndex index.cgi

   to your Bugzilla <Directory> block. You may also need

        AddHandler cgi-script .cgi

   if you don't have that in your Apache configuration file yet.

8. Visit the URL you chose for Bugzilla. Your browser should display the
   default Bugzilla home page. You should then log in as the
   administrator by following the "Log in" link and supplying the
   account information you provided in step 6.

9. Scroll to the bottom of the page after logging in, and select
   "parameters". Set up the relevant parameters for your local setup. 

   See section 4.2 of the Bugzilla Guide for a in-depth description of
   some of the configuration parameters available.

10. That's it. If anything unexpected comes up:

    - read the error message carefully,
    - backtrack through the steps above, 
    - check the official installation guide, which is section 4 in the
      Bugzilla Guide, included in the docs/ directory in various
      formats.

Support and installation questions should be directed to the
mozilla-webtools@mozilla.org mailing list -- don't write to the
developer mailing list: your post *will* be ignored if you do.

Further support information is at http://www.bugzilla.org/support/

rvm set default ruby to system

rvm reset

Tuesday, February 15, 2011

Iteration 4, Tues

Rewriting functional tests and Twist tests after adding universal login requirement to all application functionality is interesting and it depends on how you're implementing it. This will be an ongoing debate tomorrow.

The option to create a custom aspect ratio in Picasa is very very useful for creating images and banners of precisely the correct size for various websites, in this case a 760x100 Etsy store banner. 

Valentines Day in India

For Valentines Day, the majority of TWUers went to the restaurant Healthy Affairs, which is affiliated with the Sukrupa organization. The tablecloths were made by Sukrupa Creations, as were the lovely red centerpiece candles, as was the epic 3ft tall candle in the entranceway.

Healthy Affairs recently got their liquor license, and they sell local champagne and wine. I very much enjoyed the champagne, and I hear that the red wine was quite nice. The special valentines day menu was delicious. Personally, I had the garlic shrimp (i.e. prawns), the watermelon and mint mocktail, a non-veg salad (delicious mozzarella cheese, small pieces of tart green apples, firm watermelon balls, chopped head lettuce, and basalmic vinegar), and the pineapple spiced chicken, followed with a desert of strawberries dipped in chocolate and caramel.

The band that played was called The Windmills, and they did excellent renditions of love songs, mostly in English and with several great Beatles-era classics. On the walls there was an art exhibition by local Bangalore cartoonists Balraj KN and Rasheed Kappan.

healthyaffair@gmail.com
reservations or delivery: +91 80 41255073
Address:
2041, 1st Cross, 17th Main, HAL 2nd Stage, Indra Nagar, Bangalore-560008

Monday, February 14, 2011

Iteration 4, Mon

Jetty login basic authorization is not actually secure; it only concatenates the username and password and base 64 encodes. Anything that can be done in XML can be done in Java, but shouldn't always be.

If you get into hashes, you're still not particularly secure. Only when you start using salts in your hashes is it possible to escape the problem of malicious rainbow tables. And if your project is open source, then it's unwise to include your salt in the source which is going open, unless your salt generator is unpredictable. Cookie based sessions over SSL will follow logically when true security is needed.

Since iteration 1 is drawing to a close, we're planning to branch and continue development after we achieve our release candidate, so the candidate can be tested end to end.

I've been playing with EC2 for things unrelated to work, namely the git bash recursion script Maypole... which is still very basic.

Getting a working handover for the next team is an interesting problem. In general, good code explains itself, but the same doesn't really apply to build systems and to configuring local development systems.

Future TWUers: if you have Windows, dualboot Linux, ideally before development starts so you won't have to do everything twice. Keep in mind that Sonar and Twist sometimes don't keep up with refactorings of package structure and paths. Pay attention to our build monitor. And always, always check and update Mingle. Get everyone to the client site as early in the project as possible. Always invite the devs to the showcase but don't require attendance. Try to stack informative sessions immediately after standup. And remember that the buffet at the Mercurial is the best lunch you can find. Ask for feedback- it's pull, not push. Have a code review weekly and review your technical debt, but timebox it.

Apache Ivy is a .jar dependency manager, and it solves a lot of problems where we need several versions of one package for different functionalities. Without Ivy, you can get difficult to track errors if your .jars are called in an unexpected order.



And remember... there will always be "The technical TWer who likes to write their own and doesn't believe in anything." 


Friday, February 11, 2011

teaching programming

Spent part of today teaching kids to program using Scratch. I think that it's an excellent learning tool for young beginning programmers, to introduce basic if else logic and cause-effect ideas. It also has more advanced capabilities like variable manipulation. 

Thursday, February 10, 2011

Iteration 3, Thurs

Today I learned lots about PayPal in India and Etsy in general. I believe that the government of India is trying to force market pressure for a homegrown version of PayPal.

There is a Javascript plugin for intelliJ called JS Test Driver. It is useful although for small projects I guess it's just as good to use TextMate if you have it.

I also learned (from a place where I previously worked) that searching email logs can answer most of your "but what is my username?" questions.

Good client relations are very important. Sometimes this means giving small children a stuffed lion and some tennis balls, and refraining from ordering pizza. Other times, it means practicing endlessly for a short presentation so as to be ready for as many questions as possible.


Wednesday, February 9, 2011

Iteration 3, Weds

UX/UI is complicated to describe and implement. JavaScript is fun, but takes lots of lines of code. CSS is fantastic but you can fiddle with it forever.

Inspiring speakers are inspiring because they are involved in their topic.

KFC in India has veg options.

Pecha Kucha are awesome.

Tuesday, February 8, 2011

Iteration 3, Tues

Today had more string templates and more MVC pattern in Java. Lots of little details to meet sometimes volatile acceptance criteria.

An after hours project led to me teaching some basic computer skills today, and it was very rewarding and also taught me some things about teaching- namely, that doing it once is great for an introduction but won't work for skill retention. Always give the student opportunities to ask questions, because what they ask will teach you how to teach them.

DevOps is an important part of everything that we do, and I think that these articles are a good introduction to a little bit of the why and how.

A showcase is an interesting beast, and the style of it depends heavily on your audience. Technical, nontechnical, big picture, speedy, audience-driven, drawing out the audience...

Big displays on walls made out of post-its and notecards are very valuable, and there are many types of them. An iteration priority overview has a "priority line" and every time a client wants to add something to the "must do now, this iteration, today" pile, they have to take a card and put it below the priority line (which represents what will happen during this next stage of the project). As I understand it, this helps the client understand that the resources are limited and that scope creep cannot all be fulfilled in the original time period... 

Monday, February 7, 2011

Iteration 3, Mon

Giving feedback is one of the most useful things that you can do, but sometimes it's difficult to know what to say or type.

Today I learned that vimdiff exists, and that it's great for comparing long log files to see where exactly things go wrong. (It's a different matter that for some reason this one particular server behaved differently depending on where you call it from.)

I've been delving into the complexities of string templates and HTML logic as they're used in forms, and I'm becoming rather fond of both of them as much for what they won't let you do (insert logic, much, often) as for what they will let you do (put data on the screen, iterate over arrays or sets for you, and let the CSS have something to grip onto). The rationale behind the way that string templates are designed is also interesting. Hidden fields in string templates are very useful for passing data without showing the data.

To get the Ruby gem which is parsing .xls files into our database to interface nicely with the Java/Hibernate system, the current least-work solution is to export each Ruby-generated Insert statement into the large SQL file of insert statements, and then run the file from the Java code.

Bash and testbed - extracurricular stuff that I'm working on (including the somewhat messy Maypole project, which is unconnected to work- or, indeed, anything "useful" other than keeping me entertained)

Future TWUers: Cafe Thulp sells burgers made with beef. After a few weeks in India, you or your coworkers may crave these. It's a pretty short walk from the office- only about 5 blocks. Prices are reasonable, considering the rarity of what they're selling.

Thursday, February 3, 2011

Iteration 2, Weds


I will be working more with the Ruby gem roo, and also jruby. I'm looking forward to it and I believe that my teammates also welcome this opportunity.

To add a .jar file (or a directory of them) to the IntelliJ filepath, in your module dependancies tab (in the project structure dialog) add a "Module Library". There you can select a Jar Directory (from your local computer) to add. Then make sure the run profile is using the Classpath and JDK of the correct module when it runs (this is in the run config dialog).


In Java, the Date and GregorianCalendar objects are verboten when following best practice unless you have a "good reason" (i.e. not ignorance or laziness) and really Jodatime is much better and more intuitive anyway.

I've been reading through the documentation of guava, which Google's favorite java libraries.

Axure for wireframes is doing good things to my understandings of stories right now, and it seems pretty simple for the analysts to use.


Iteration 2, Thurs

Hibernate is an interface layer between Java (or .NET) and a database. Saving a change in a record in a table from Java through Hibernate to a database is as easy as creating a Session, then a SessionFactory which is a new Configuration, which you configure using buildSessionFactory. The session is your new factory, and you open a session with it. Then, create a new transaction which begins a transaction in the session. 
Dog dog = (Dog)session.get (Dog.class, new Long(1)); 
Then update your object, say Dog, with the parameters you want, like .setBark and .setFurColor. Then use the .update function of your session, the .commit on your transaction, and finally close the session. 

CCMenu is a nice small and clean build monitor. And it turns out that with a plugin you can rig it up to play a music clip which changes depending on whether the build is red or green. 

Git is an interesting beast. Hard reset is useful, and revert is easy to misuse but is still the best way to fix a broken build and get out of everyone's way (if it's not a merge that you're trying to revert).  Fetch is useful for seeing the differences between your most recent pull and the most recent state of the origin master without having to commit and stash your local changes to prevent being overwritten.




Tuesday, February 1, 2011

Iteration 2, Tues

A long morning retrospective is an unintuitive event to schedule, but sometimes a good idea, and my pair and I still got a nice chunk of work done before lunch. As part of the learning process, our team has been leveling up to the point where we self-start our internal processes without trainer (i.e. boss) supervision.

The ruby gem roo imports data from spreadsheets into wherever you want to send it- usually a database of your own. Some experimentation with it today revealed two important things:

  1. roo 1.9.3 does not appear to install its own dependencies. When using roo, write a script to take care of that.
    Dependencies of roo:
    bones (3.6.2)
    builder (3.0.0)
    google-spreadsheet-ruby (0.1.2)
    little-plugger (1.1.2)
    loquacious (1.7.0)
    nokogiri (1.4.4)
    oauth (0.4.4)
    rake (0.8.7)
    ruby-ole (1.2.11.1)
    rubyzip (0.9.4)
    spreadsheet (0.6.5.1)
  2. roo can import data from .xls or .xlsx and parse it into the variable types that we need.
An alternative to roo is Apache POI, which is written in Java and thus will interface with our system through fewer layers than roo would have to. A third alternative which we may or may not explore is to use the java bindings provided by OpenOffice. 

When it comes time to use these with parts of the real dataset, we may expedite redumping the .xls by dumping csv and checking md5sums to validate the cache. i.e, find /path/to/spreadsheets -name '*.xls' |md5sum > checksums.txt, and then use a diff to compare to the last run. 

To open any file in mac terminal, open filename.extension will accomplish the task. 

Quote: "learning what you're dong rather than how to do something" (in relation to how to find and adjust paths of inputs and outputs rather than how to do so for a specific program)

In connection with roo, I spent some time getting several haphazard installs of rvm into a more understandable state, setting a default ruby (1.8.6 because of the OSX support) and examining the different places where gems can be installed to, and the possibility of automagically-generated symlinks from all installed rubies to the system ruby's gem folder. However, it seems too complex for our current problem, and perhaps unwise in general if versions of gems become a relevant concern. 

IntelliJ library dependency filepath complexities are deceptively simple, and some of the error messages are verbose but unilluminating because in this case the desired classpath seems to match the existing classpath but the error persists, which leads me to believe that the error is symptomatic of a different problem. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException

Monday, January 31, 2011

Iteration 2, Mon

The logic and syntax of more involves shell scripts is a continual source of interest and intrigue to me. Specifically, an if-fi statement which determines whether a certain command returned an error and if so exiting the script flow, and if no error the if will continue with the install script. The logic behind double square brackets in conditional statements in bash is that they make a wildcard do "shell globbing" which I interpret as meaning that it is a true wildcard as they are usually used in bash rather than a wildcard limited by the local directory or logic function that they are enclosed in.

I spent some time reading about programming languages which use vocabularies other than English. Not everyone can code in english, even if the ASCII set is generally intolerant of the umlaut and accent marks of the world. To say nothing of ideograms.

I spent a little time with ~/.gitconfig and ctrl-comma to make my environment visually coherent. The standard aliases are also useful.
[alias]
st = status
ci = commit
co = checkout
br = branch

You make a symlink (which doesn't really exist in Windows) using ln -s origin destination and it is extremely useful, especially when trying to get all of the correct files into version control when one of them "has" to be in a certain directory which should not be under version control. I learned about how to copy a path using pwd | pbcopy and also the rules of meaning behind . .. / and ./

/absolute path
./path relative to current director
. local directory
.. out one dir (closer to root) 
Previously, I knew many correct usages but not the underlying syntax logic. 


I believe that it is currently impossible for a program to analyze code well enough that it could autotag a class or project with tags representing certain code technique chunks which are used in it, like the Observer design pattern or a for loop which iterates over an array in order to concatenate all the contents of the array into one long string, or a do while loop which iterates through a list to add the sums of all the odd numbers in it.

The purpose of this would be to be able to search your own (or communal) codebase for certain code chunks. This relates to the "I did that in a previous project but I don't currently remember how and googling this has a low cost-reward ratio" problem which I believe is somewhat common. This is kind of like a code snippet search system, except that the search is secondary because the identification of the purpose-driven techniques is the main point of the automation. Again, I don't think this currently exists or is even implementable, but if I'm wrong I will be very interested in the manner of the solution.

For future TWUers:
When you must order ice cream to clear the ice cream meter, keep in mind that the fruit Chikoo is very tasty and you can order ice cream flavored with it to B2 from a place called Natural.

Friday, January 28, 2011

Iteration 1, Fri

Today I spent a large amount of the time discussing analytic paths and the site visit yesterday rather than coding/configuring/scripting.

Git is a complicated beast which enables many fantastic data exchanges when you use its higher level commands and setting modifiers. I have found no tutorials particularly suited to my usage needs, although this one was informative.

I installed and spent some time using Wordpress today. Also, I learned some things about path errors in OSX and thus about .bashrc and .bash_profile.  

Thursday, January 27, 2011

Iteration 1, Thurs


Wednesday was Republic Day in India, which is a national holiday. Thursday, after the morning standup meeting, work continued on iteration 1. Tools I used included XML for Ant, bash scripts to automate pre-commit testing, git for version control, and Go.

In the afternoon, some team members participated in a site visit. Discussions with the client about terminology, logic structure, and priorities continued apace.

After the site visit, we had the weekly Pecha Kucha presentation night. Presentation topics included comparative education quality and its implications for the rise and fall of nations on the global stage, the history of Bangalore, inspirational quotes from Fight Club, the island Noronha, investing, Latin, and the Manneken Pis statue. 

Monday, January 24, 2011

TWU learning journal (project day 2) Tues

Today, donations for the client are up through Ammado. This is major value delivered.

The main representatives of our client visited us at the office today to observe the process, give feedback, and to discuss priorities and next steps.

In Go, you make a pipeline by writing it into existence in an XML file. In a pipeline, there are stages. In a stage, there are jobs. Jobs have input, and produce output files which are known as artifacts and which following jobs and stages can use as inputs. Agents are machines on which your build will run. Jobs can be run in parallel.

Power outages are not uncommon in most of India and thus our office has good protections and backups which prevent productivity disruption.

I worked with automating processes using shell scripts. I have made great strides with using IntelliJ efficiently. I am learning about git, especially the usefulness of git rebase. Also, chmod, which is a bash command. To call TextMate from the commandline, use "mate filename"

A .war file is a type of .jar file which is a type of .zip which is self contained i.e. has everything inside of it that everything inside of it requires to run.

In our project, an enhancement to a story should be a new story card.

You can write unit tests for XML. I wonder if this is a good idea for our project.

For the future TWUers: a good food delivery place near the office is
called Healthy Affairs. Phone# 9900690600



TWU learning journal (project day 1) Mon


Sonar is for code metrics, and is usually installed on a build server. It requires a database as well as access to a code repository. By default it uses localhost:9000.

A spike is a (usually timeboxed) experimental activity (usually by developers) to calibrate time estimates about new technology by gaining experience with that technology.

I am currently unable to find mentions of using Sonar with Apache Buildr.

Future TWUers: the food at the office is quite good, although it can be difficult to get used to if you are accustomed to a significantly divergent foodgroup norm. It is possible to order out for lunch either in a group or individually. In the pantries, you will find juice, soda pop, milk, bread, and snack items like chips and popcorn, as well as quite nice coffeemakers.

Sunday, January 23, 2011

Weekend in Bangalore

This weekend, many TWUers flew to Goa to enjoy the beach. In Bangalore, there was a political protest which caused the majority of shops to be closed until the evening.

Future TWUers: The Java cafe is a sit-down but informal 24hr resturant in G block which has passable hot food. Service may be slow.

Total Mall and Oasis Mall are both within a short rickshaw ride of Diamond, and both will supply your grocery and clothing needs more than adequately.

The Sunday brunch buffet at the Citrus restaurant in the Leela Palace is elegant and has an enormous selection of delicacies and deserts to taste, including gourmet cheese and lots of meat as well as many veg dishes. The cost is rather high but I consider the experience more than worth the cost. The gardens and architecture are beautiful.

Elsewhere in the Leela there is a shopping mall which contains a bookstore that also sells board games and nerf guns.

Friday, January 21, 2011

Training day 10 - Fri



The tech stack for the upcoming project is not unusually long and it's quite interesting. This is my first introduction to Jetty, Log4J, and Hibernate.

Today I installed Twist for the first time and learned some advanced user ways to use Mingle.   

Some types of testing include browser compatibility, security, performance, variety of users, usability.

Open space talks today included: our tech stack, the complexities behind floating point numbers, and origami. 

We've been experimenting with a variety of different ways to perform retrospectives, including writing our thoughts/concerns/goals on post-it notes and sticking them to various types of cartesian coordinate graphs drawn on whiteboards. 

Our first TWU pub night was very nice. The pub quiz was a great rendition of its sort, and TWUers had much fun with nerf darts, balloons, rubix cubes, and the hotel swimming pool. Later in the evening some us played with remote control helicopters bought at the toy store in Oasis Mall. 

Thursday, January 20, 2011

Training day 9 - Thurs


Stretching the mind to include not only new tools but new concepts involves a period of confusion as the knowledge is first acquired and then internalized and merged with the existing knowledge base.

Hibernate can create tables from your object setup. Presentation on Hibernate

A build should be crisp: complete, repeatable, informative, schedulable, portable.

The conventions for a project filetree are based on the need for structuring things so that the build won't include the source code or the tests.

New terminology: smoke tests

Configuration file discrepancies are the most common cause of "but it works on my machine!"

Today I extended my knowledge of MVC, SPring, java servelets and their usage as dispatcher servelets, some programming patterns including Observer, Controller, and Filter, IntelliJ keyboard shortcuts, and JSTL

Recommended books:


Wednesday, January 19, 2011

Training Day 8 - Thurs


Composition is preferred over inheritance because having a reference to another object rather than inheriting from the other object increases the amount of the flexibility in the system, which is inherently desirable for systems which will need to be modified. 
An important part of pair programming is having a mental map of each other's sentence structure and idiomatic phrases. This is not a cross-cultural problem so much as it is a problem experienced by people who do not yet share a common set of descriptors for the problems that work brings to them. 

Estimating project stories is an exercise which relies on relative measurements rather than absolutes, because absolutes (i.e. time taken per "point") will be discovered in the process of the first iteration. Also, points per unit of time are roughly equivalent across different groups of developers if and only if a "point" is understood to be like a unit of currency. In other words, I can buy a pair of sandals for Rs300 or for USD $6 but they still cost the same amount. In my opinion, this also has parallels in "absolute time" as it is measured across systems undergoing relativistic affects.  

The good citizen principle by Dan North discusses reasons why checking inputs that are passed internally within a program rather than in from user input is usually unnecessary.  

Mockito makes provisions for a test which is expected to throw an exception. @Test(expected=IndexOutOfBoundsException.class) delights me with its implications for testing sad paths. 

DBDeploy and types of test doubles came up today. Also, Junit is more complex than I knew about, and a little reading goes a long ways.

Future TWUers: 
  • There is a small object somewhat like an air freshener that plugs into a wall socket and glows orange. If you are having a problem with bug bites, stop by the H-block corner store (or N-block may have them also), buy one, and put it in your bedroom. I believe it costs ~300Rs and the price is absolutely worth the reward. 
  • In India, "sick" means "nasty" and "ill" means "sick" i.e. if you call someone sick, you're calling them disgusting. In general, everyone here is very understanding about nomenclature misunderstandings, and they're usually entertaining rather than offensive. "elevator" vs "lift" in the USA vs the UK appears to be the difference between a part of an airplane, and what one does to freeweight exercise equipment.
The internet tells me that somewhere in the world there are companies which have all of their code in a database, which they access with a thin interpretive layer. This is apparently an enormously bad idea because of its effects on testing, maintainability, and speed. I don't know how anyone thought that such a thing would be a good idea in the first place... and I'm curious. The way to refactor this codebase is to slowly add test coverage, and then refactor (in small chunks, starting with the most-used and -modified parts of the codebase) but first they have to start by making and watching a giant logfile to understand the current/expected/default behavior.

This was the first week of Pecha Kucha presentations, and some of the topics included constructive failure, clubs, the concept of "chaordic", science fiction, and saving the tigers. 

Tuesday, January 18, 2011

7

Often, presentations require slides, and often slides require pictures without copyright restrictions. FlickrCC, coolIris, SXC, and EveryStockPhoto.


Monday, January 17, 2011

Training Day 6


Today was my first day at the ThoughtWorks Bangalore 2 office. The people seem very nice here. We have floors 2-4. The second floor is where the snack room is, and the 4th floor (open to the air) is where lunch and breakfast are served, and there are games tables if you want to play pingpong. Everywhere in between is work space- classy, clean, well-supplied work space.

The first day in a new office (for new employees, no less) can be expected to be a sort of shaking-down period, wherein everyone loses their way and their train of thought sporadically.

Future TWUers: Between B2 and Diamond, there is a mall which contains a grocery store called Spar, which is reputed to have lots of "international" food if you're homesick. Although you can get popcorn, potato chips, and soda pretty much everywhere. A rickshaw ride from Spar to Diamond should be about 40Rs.

When typing up a retrospective, just put down the action points and the names of the people responsible for them.

Homebrew is a great tool for Mac users. It's roughly equivalent to apt-get for *nix.

TWU: week 2, day 1 (dev room)


The controller (in MVC) translates user actions into business logic actions. Keep controllers small, and be consistent in how you split them up.

The god object smell is too many responsibilities in one object.

A book that we (and you) should absolutely read as soon as possible: Working With Legacy Code by Michael Feathers.  We also discussed books by Kent Beck, which are also recommended reading.

A region in C# is for use with Visual Studio to collapse and expand views of code.

The refactor called Sprout Class is to extract a class out of an enormous file of code, so you can test the little extracted class. Future TWUers: minor refactorings like this will become part of your thinking, rather than a separate concept.

"Test-friendlies" are collaborators that you can trust and directly instantiate. Encapsulation promotes maintainability. I asked a question about YAIGNO vs elegance and where on the scale one should fall. A trainer answered that "This is a debate that you'll be having with yourself for the rest of your career." So just keep that in mind.

It turns out that "Try to make the code represent the domain that you're writing in" means "When you go to the codebase, you should see the same terms that the client uses." I didn't know in what way the code should represent the domain! I thought that he meant in structure... but now that I know that he meant key terms, it makes more sense. This is different from domain-specific language even though the term sounds similar.

Us TWUers may have the honor of being able to read (and give feedback on) a chapter on encapsulation that Jim is submitting to the next TW Anthology.

We did a short pair-programming exercise on implementing the class Rectangle, and another one on implementing the class Chance and making its not() work. This is basic stuff, but it was more to teach us about pair programming and understanding logic flow and requirements than anything else. I think the assignment did its job admirably.

Packages and naming of packages: I somehow exited university with no grasp of how or why. Now I know both, at least somewhat.

"If you use inheritance, use polymorphism." "Inheritance is very costly, very expensive. Make sure that you're getting something for it."

Value objects are: mutable, easier than immutable, passed by value, and provide seams for testability. Tomorrow we learn about source code management.

Identity/compare functions should be reflexive, transitive, symmetric, and consistent. (If they aren't, is it on purpose?)

If you use Visual Studio, you will probably benefit from using the Resharper plugin.

Future TWUers:
You will want a notebook during the first two weeks of TWU. You can find them in the red cabinet near the big printer in B1, or just ask around.
Also, you will rapidly become a power user of IntelliJ, but the learning curve (for both program structure, and keybindings) is steep and may feel unpleasant. Give in to the power of option-shift-A for accessing the refactoring menu. Resist the urge to navigate by mouse. Ctrl-B will go to the originator of the variable/method/class which you currently have highlighted. To pull up the rename menu, use shift-F6. Avoid renaming things without the rename menu if they are in wide usage.
Play around with git and svn a bit. You can make yourself a github repository and experiment with it, then delete it if you want. If you are assigned a PC by 8600, strongly consider getting it dual-booting some form of *NIX, and/or run a virtual machine, depending on your preferences. This will affect your security arrangements but it can be worked around- just ask the help desk people; they're excellent. 

I am having some difficulty adjusting to using a Mac, but I know it'll be worth it.

"If you don't know where to put behavior, maybe you need another class." <- this was very helpful to me. Also, "Don't expose size unless you have to; use iterator." (if you're using size to iterate over something)

Sonar makes reports on metrics of code.  It is very useful for getting an overview of a codebase too large to read ("thousands of classes"). In smaller codebases, it help you monitor your test coverage. You want to install Sonar on your ci (checkin) server in such a way that when someone pushes code to your repository, your CI server will re-build the project and then trigger Sonar to run.

   * problem : our fix (in the practice codebase)
   * loop doing too many things : split loop
   * feature envy : move method
   * too many parameters : extract class (created History class)
   * magic numbers : constants i.e. express intent by using variable names
   * temporary variables : inline
   * violating law of Demeter : create getter in Movie for title instead of calling though

Law of Demeter - only talk to your immediate neighbor. too many calls chained is called a train wreck.


minGW, cygwin, and puTTy are all *nix commandline emulators. Of the three, I prefer puTTy for its UI, but they're all pretty equivalent.

The trainers recommend that analysts should look into software which creates wireframes quickly and easily, rather than mocking them up in Illustrator. For these things, you need intermediate steps or the client will mistake a picture of the thing for the final object.

There's a google app called browsersize which helps you test your webpage in different browsers and monitor sizes etc so you can see where the fold goes.

Sunday, January 16, 2011

"Where I grew up, speaking English would get you teased."

Sitting around after hours, we were discussing TWU-related difficulties. "I don't understand 50% of what you say. Everything is out of context." And here I thought that my diction was passable... "100% of it I don't understand." (About understanding an Irish accent)

I also currently have an auditory comprehension problem with Indian accents. Trying to understand someone who is speaking quickly will make me say "I'm sorry, can you say that again?" repeatedly. Which is bad, because eventually the other person gets fed up and says "Never mind, it wasn't that important anyway!"

Discussing the differences in social dynamics, it seems that in Indian culture (according to one of my teammates) "The person with the laziest opinion wins," and "usually no one goes anywhere." Also, it's considered rude to split the group, when there is a group hanging out together. (?)

We were discussing the service culture and how I was surprised and displeased by some aspects of it, and the phrase "It's like heaven on earth for us." was spoken- meaning that Diamond District feels very luxurious for some of the students.

I also learned for the first time about the Hofstede Index (about how cultures value various person attributes) and where India falls on it. 

Saturday, January 15, 2011

the Undiscovered Country (is next week)

For a pile of 22 recent college grads, only 2 of whom have ever been on a client project before, knowing that next week we get to Actually Do Something is a little exciting, like ziplining for the first time is a little exciting. "We're going to push you off this cliff," they say, "but it's okay because you're wearing a harness and the harness is attached to a metal rope." The trainers are the harness, the rope is TW, and the TWU students are, collectively, the lucky schmuck who's getting pushed off the cliff. People do this for fun, you know.

It's possible to learn while performing mindless tasks, if the material upon which you are performing the mindless task contains information which is new to you.

Future TWUers: here is a short list of cultural differences.

  •  "take a click" = take a picture
  • "jumper" = sweater (any kind)
  • Waiters at classy restaurants may argue with you and try to get you to order more food or more expensive food, or appetizers when all you want is a main course. Just be firm and after two or three rounds you can have your way.
  • Bars in Bangalore close at 11:30pm. You will be asked to leave by 12pm. Liquor stores close at 10, I believe.
  • At a classy restaurant, you will get more table service than is the Western norm. They may try to serve you from the main dishes in the middle of the table when you're eating "family-style."
  • When you go through a buffet line, you will still only rarely be able to serve yourself.

The title of this is from the Star Trek VI: The Undiscovered Country, which is in turn a quote from Shakespeare. "The undiscovered country from whose bourn (boundary) no traveller returns."

scattered showers of TWU predicted for this evening

Central organization of assignments will be much easier when we have a story wall. At the moment, everyone is evolving their own system.

Exploratory testing and black box testing are similar but not the same. 

TWU homework continues

Having developers write user stories is enormously useful. It changes your perspective.

Future TWUers: you will have a housekeeper. I personally find this difficult to get used to. However, he does do the dishes and bring you an ironing board when you request one. 

Friday, January 14, 2011

Service culture: housekeeping

I feel that Diamond District could be much improved by including "Do not disturb" signs with the apartments.

Future TWUers: that strange switch by the door that doesn't appear to do anything controls the power flow to your doorbell. 

making popcorn in India

It takes four to five minutes for most microwaves in Bangalore to pop a bag of popcorn. Watch it closely, because it varies.

I've noticed that ice cream is a luxury here moreso than it is in the US- perhaps because of the power outages? It would be difficult to keep ice cream from melting here. However, I believe that it can be delivered. 

comments broken? && PowerPoint on Mac

I was told today that someone left comments on my blog, but I checked and there are none that I can see. So I believe that google reader doesn't interface completely with Blogger.

PowerPoint on Mac is the most powerful presentation tool I have ever used. It is glorious. I was playing in a sandbox before. A small sandbox with no toys. And then someone gave me a water park. I think I'm beginning to understand how Sumeet does the ridiculously awesome things with slides that he does. I'm doing my pecha kucha on science fiction.

Learning journal (training day 5)


Future TWUers: many people travel in India outside of Bangalore on weekends. Buy your tickets a minimum of two weeks in advance, or ticket prices rise dramatically. Some stay in Bangalore and find other entertainments. The bar Geoffery's at the Royal Orchid is just next door, and has prices roughly comparable to what you'd find in a neighborhood bar in Chicago.

I should post the retrospective notes (perhaps using this? http://retro.play.railsplayground.net/)

Reticular Activating Syndrome is concept within neurolinguistic programming, which we had an open space on today. 

Training Day 5

Recap of Thursday last session: TDD, refactoring, hot keys, ping pong, unit test, JUnit, hamcrest, statics, methods which are there only so you can test them (are bad)

For those of us who are completely done with the curriculum, we can help with the setup for the project. Stuff like setting up Go, the repository, etc.

I learned that UK Macs have a slightly different key layout- just enough to screw up my muscle memory.

It is very important that we have a deep understanding of what null pointers are and are not, because interpreting error messages is a large percentage of what one does. 

Session on retrospectives:
We talked about the "safety check" exercise, where everyone puts a number from 1-5 (5 is comfortable, 1 is on the verge of setting the place on fire?) on a postit, crumples it, and someone comes around with a bag and collects them anonymously. Uncrumple them and put them on the board and see what the group is feeling..

Sometimes the safety exercise is followed by an anonymous round of "what would make you feel more safe?" (Sometimes the answer is for the senior architect to leave the room... or for the client to leave... etc and sometimes the recommendations are followed if the facilitator judges that that would be a good idea)

Make sure that your retrospection makes action items! Also that there are specific individuals' names on them- ownership is essential. Group ownership does not work. 

One of our number has a rather bad toothache, unfortunately. Current resolution is painkillers and soon a dentist. 

Future TWUers: consider making an excel spreadsheep of weekend trips, with columns for cost, organizer, activities, and dates.

We had an open space that included discussing several TED talks and their value as presentations. 

Thursday, January 13, 2011

Why static methods and variables complicate everything

My most useful sources for this were:
rancorbeast
blog by misko
blog by jagregory

Unit testing depends on being able to set the variables which part of your program uses, and then see whether the part of your program which you're testing uses them correctly. But if what you're testing requires manipulating or reading static variables, the test cannot be written efficiently, because the static variables are static and hold their value for the entire run of the program. Because having static variables makes unit testing difficult or impossible, it is less likely that a programmer who uses static variables will use unit tests. This implies that their test may break without the programmer knowing about it, and that the programmer might not follow other best practices, since they don't follow the one about testing.

Static methods make code harder to change, because other parts of the code may rely on the static methods being static. This coupling makes your design difficult to change. Having a design that is easy to change (refactor) is good, because then you can refactor it to make it better. Static methods imply the presence or incoming presence of bad design because the programmer has not given thought to making the program easy to add functionality to, and to refactor. If refactoring and/or added functionality is tried in the future, the code may begin to accumulate workarounds to the static methods. This will make the code longer and more complicated than it needs to be.

Static variables make thread safety almost impossible to achieve because they are a shared state, which is almost always bad. Static variables, and anything they access, can be accessed concurrently by different threads unless you take pains to synchronize access to them. While you can guard them, if you have too many of them your design is harder to validate because the locking will be more complicated. If there are enough of them, then performance will suffer because of different parts of the program waiting for other parts of it to wait for locking to resolve.

what does hot dogging mean?

To hot dog is to do something to a computer which is unlocked and unattended. (Around here, we require that it be nondestructive, nonexternal (i.e. send no emails, edit no databases commit no code), and fast to fix.

We usually just switch the keyboard layout to Dvorak, and invert the screen (ctrl-option-command-8). It's simple, fast, and noticeable.

The purpose is to train in data safety- if you leave your computer unattended, anyone who wants to can look into your files. General etiquette strongly prescribes against looking other people's computers, but it's best to not leave things to chance when there is sensitive data involved- especially if you are not working surrounded by teammates who are all privy to the same set of secrets. 

Hamcrest

Hamcrest is a framework for creating matchers, allowing match rules to be defined declaratively. These matchers have uses in unit testing frameworks such as JUnit and jMock. Tutorial It is commonly used with JUnit.

Training Day 4


Today the last of our TWU students arrived, and the group spent some more time performing introductions. We had several sessions, including one on open source and being aware of legal issues. (We are encouraged to contribute to open source projects.)

Some more exotic ThoughtWorks history includes the tale of the ThoughtWorks RV, which sounds absolutely delightful but I understand that the coolness of it didn't make up for the lack of demand.

Future TWUers: the Royal Orchid serves delicious food. You will become spoiled. :) Also, their other facilites are convenient and well stocked, which you will probably be very grateful for at some or several points.

There is a small grocery store in H block which has a pharmacy in the back. I highly recommend the snacks they sell, as well as their selection of mosquito repellant products and their q-tips.

There was a live demo today about pair programming- specifically, how not to do it. It was hilarious and a very effective learning tool.

Future TWUers: do not underestimate the amount of preparation you should put into the history session.

Wednesday, January 12, 2011

Yammer

Is exclusive like facebook used to be- it's only for people with a company email address. I like the interface- it's simple and works well. Usage is growing but I'm not sure how it supplements or replaces other free-for-all discussion zones within the private company network.

I've been added to the TW bloglist. I've read the TW blog policy (thanks, Roopa!) and the part that says that I have to be interesting is only a comment at the bottom of the main document.

Feedback

My suggested draft of a communication from and to someone at a company (which is not TW or a client of TW):

I would say "If you look at your error message, it's caused by the fact that in the code you sent me you hard-coded the path of a file in your program to find a test file in your own system. This is not acceptable. It also implies that you haven't done testing with a significant test set, which is also not acceptable. Please tell me what work you plan to do on the two technical errors, and your thoughts on what I/Company can do to help you improve your quality of work on this project."
I think that my feedback is too harsh. I think if the "This is not acceptable" was taken out it would be better. However, the person being addressed has shown a lack of knowledge such that there is a need for very clear statements about what code practices are not best practices.

There's rather a lot more in the above vein, but this is the part that makes me most wonder what more I have to learn about feedback. 


TW Anthology

I learned about the TW Anthology today and checked it out on Amazon. Looks like they're a little expensive.

Training Day 3

A burn up chart keeps track of what the tasks are and in what stage of done they are. It is shared with the client, and it builds trust and helps to avoid surprises.

A lesson learned from the lego exercise: there was no user story for the body, but we had to build it in order to attach the legs to the head. Same for many parts of software. These are called nonfunctional requirements. 

In my opinion, Agile is just a zillion tiny waterfalls, with a customer on your shoulder.

As a warmup, we played charades, only the words were concepts from yesterday.
YAGNI - "you ain't gonna need it."
"every line of code is a libility."
Cycle: Estimate, plan, develop, showcase, retrospective.

The economic model of TW is based on where a $1 of revenue goes. There was a pi chart that had many parts. There are several types of overhead. Salary ia large part of total expenses. 

TW earns fees from clients. If the client is displeased with the work, or thinks that they will be displeased with the work partway through the project, they might not pay. As TWers, we have to do well enough at making good work and communicating with the client that this problem is kept to a minimum.

Fixed costs include rent and servers. TW treats employees as a fixed cost rather than a variable cost, which means that when times are bad TW doesn't just start firing people. "The biggest problem in this industry is getting good talent. Pushing them away (doesn't make sense)"
Operating expenses include the salaries of Legal and Recruiting. There are two kinds of overhead: overhead that goes towards any one country/office, and overhead that goes towards the company as a whole.

Types of deals in the consulting world: time and materials, fixed bid, and risk and reward (which is a combination of the above two, I think.) TW does mostly the first type. "TW charges more per hr than most other companies."

Risk and how it influences fixed price deals. Caps on time and expenses deals.

SOW = statement of work. It's a cost to fixed bids, and it's corrosive to the relationship...
The deal review process happens before TW decides to try to get a project(?): capability(can we do it), intangibles (new tech is good because it gives us an edge later), financial (how's the compensation).

Gross margin should be a certain number (but in the example we were shown, was below that)
On your first day on a contract, "what's in the contract?" (hardly anyone does this, but it might be a good idea?)

Differences between the UK and the US in how billing works- country customs and regulations(?)

Accurate timesheets confirm (or indicate a need for fixing) estimate quality.

A shadow is a non-charged consultant. It's a way to train a junior consultant and make them useful.

Blended rate

Wikileaks:
There will be a forum tor tech leaders and tech $ people at the Churchill in the Bay Area next Weds at 7pm their time, 8:30am our time. TW is sponsoring it. It's being broadcast live and we may be able to watch it if our trainers let us take time off during the work day to do that.

The boycotts of Wikileaks by various companies.

Lawrence Lessig wrote a review of the Social Network that goes into a case study about Nantucket Nectar and why the internet is a good thing in that context.

The subpoena of Twitter records in relation to Wikileaks.

Daniel Ellsberg, the guy who stole the Pentagon Papers, is 83 and still gets arrested at protests. This guy is badass.

Civil liberties group involving tech companies?