Xtranormal: Text to Movie

I've stumbled across a number of videos in the past few weeks with text to speech voice acting.  All of them looked quite similar and I wondered why.  The reason?  They were all created with Xtranormal's software.  Free offerings exist and I made use of them to learn more.  Watch the Xtranormal video below for my impressions.


http://www.xtranormal.com

Website Design Melody

I'm just going to let the video speak for itself.

Google's Instant Gratification

You're probably already aware of Google's instant search feature.  http://www.google.com/instant/  This is a really neat idea of giving you results as you type, helping you key in on search terms or just save time.  Unfortunately, it just doesn't seem to click with most people.  I admit I have only begun to really feel some benefit.  It doesn't help on every search, but when I can simply redefine my search before refreshing the page on a more niche query it does save me time.  It also helps me get a better conceptual idea of the keyword web space.

I just learned about keyboard navigation on Google Instant, which I think might make this product even more useful for me.  http://googleblog.blogspot.com/2010/09/fly-through-your-instant-search-results.html

A new instant feature from Google is now out though, one that I think could be more useful than either of the other projects similarly branded.  Instant preview (http://googleblog.blogspot.com/2010/11/beyond-instant-results-instant-previews.html) gives a snapshot of the page in the search results, no need to go the page.  A picture is worth a thousand words and this can easily help me skip the results I'm not interested in.

I do however wish they had made the snapshot show up automatically as you hover over the links by default, instead of having to turn it on the first time by clicking on the magnifying glass.  Also, the need to actually perform the search (i.e. leave the instant search function) is also aggravating.  Just show me a preview of the top result and let me use the arrow keys to exit and return to instant search without finalizing my search.

Thoughts on Software Testing

Less test coverage <==  ==> More test coverage
Y increases with cost
This is partly a response to the blog post by Derick Bailey linked below.  It is mostly an effort to help articulate my understanding of testing strategies that I am woefully unexperienced in.

http://www.lostechies.com/blogs/derickbailey/archive/2010/11/11/cost-vs-risk-in-testing.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+LosTechies+(LosTechies)


Each type of testing covers a different class of bugs, which combined only add to 100% of error cases coverable by testing.  Yes, there is some overlap, but that brings me to my next point.  


Different types of testing also have drastically different costs associated.  If we could afford true 100% end to end testing, maybe unit testing wouldn't be required.  In reality, we rarely ever do.  100% end to end testing is too expensive in terms of time and money.


We do unit testing and integration testing because each is much cheaper than end to end testing.  This is in no small part do to the fact that it is agile.  We get a cheaper bang for our buck, but we also get it during early development.  Sure end to end could handle a working system, you get no help from end to end testing when building a system bottom up or developing a new slice from the middle.  


So why not skip end to end all together?  Well we have some diminishing returns.  Your first end to end test is going to be more productive than your unit tests at some point.  It doesn't matter if all your code is unit tested if you have a show stopper that an end to end test would have caught.

Overlap certainly is waste, but is not alway economically avoidable waste.


Consider a car.  We can install a roll cage, air bags, and a seatbelt costing 1000, 100, and 10 dollars respectively.  A roll cage may reduce the chance for injury in certain crashes just as effectively as an air bag or seatbelt, but it may do nothing in other cases or it may be vital.  In reality, car manufacturers provide a combination of techniques which provide a sweet spot between economy and safety.  They focus on those efforts which give the greatest return, even if they necessarily create overlap in function.


Risk is not easily compartmented into each category of testing.  Sometimes you need both belt and suspenders.

Modal Style Boxing Day

I've seen a plenty of websites that use modal style windows particularly for photo galleries.  They can be used for a variety of other content as well, giving a clean looking UI.  A little bit of polish, that give a fair amount of bang visually.  Unfortunately, the javascript behind it has always been a bit arcane.  I stumbled across a few snippets of code that claimed to handle it, but I was worried about continuing cross platform compatibility.  Luckily, a smattering of jQuery based projects have been developed to solve that problem.

One you might look at is FancyBox (http://fancybox.net/).  I haven't been able to take a chance to use it, but if the landing page for the project is any indication you can make some smooth UI with it.  Definitely something I will use in my next personal project.  Almost makes me want to write something sooner rather than latter just for the cool factor.

Opening up a can of source: Open Source Pros and Cons

One of the more interesting decisions I think an individual or organization can make is whether or not to make their software open source.  Here are some factors I've been going over that I think make the difference.

Difficulty

Open source lends itself best to the very easiest and very hardest problems.  The very easiest will get implemented by competitors anyway, so no advantage is kept by proprietary source.  The very hardest are beyond the scope of most teams, crowd-sourcing is a major help for these projects.  Configuration scripts might be an example of the former, research projects the latter.

Budget

Open source works on no budget, or more accurately donated time budgets.  Proprietary code rarely works under that environment.  Proprietary code is boxed in by budget, so your code must be justified by the financial returns.

Time Frame

Is your code timeless?  Do you expect it to be used far into the future?  Then it may be a good fit for open source.  The longer you are in development, the more dividends crowd sourcing can pay.  The longer your solution is useful, the more likely someone else is going to develop a similar solution.  Open source also let's your users update it themselves after you've dropped official support.  Proprietary code instead trades on users needing a solution "now" for the problems they have "now".  Support of proprietary code is only provided as long as it provides a good rate of return.

Audience

Are your users developers, system administrators, or highly technical?  Is your user population very large or very small?  If your users are effective contributors (in development or testing) then open source is going to get a super charged crowd sourcing effect.

If your user population is very large, then crowd sourcing still is in effect even if average contribution per user is low.  Large user populations also attract competitors, which can be hard to fight off without network effects of obtaining a large user base.

Very small user populations are difficult to monetize.  Even if the your company generates some advantage from internally developed niche applications, it might still be useful.  You might generate more by getting contributions from other niche users who don't compete directly.  You might open up new business strategy by lowering the cost associated with maintaining the code.  Finally, if your internal project is behind the market leader open source may help you achieve parity at a lower development cost.

Final Thought


There are better explanations of the pros and cons of open source, but I hope you've gotten something out of mine.  The most important factor of all of these is time.  When development time is plentiful, open source thrives.  When you start running against some constraints, proprietary code begins to make sense.  If you box your development constraints in too far however, proprietary code no longer makes sense.

A recent argument I had: Math in Programming

http://writing.bryanwoods4e.com/1-poor-poor-child

A friend pointed out the following quote from the blog post linked above.
I'm not sure how this stereotype got instilled in me, but I'm slightly embarrassed to admit that I was surprised to discover how little math is involved in day-to-day programming, especially for a web developer. A command of the written word is far more important. Intelligent, clearly-articulated prose is probably the most significant goal for both writers and programmers alike.
The math I do regularly is much more similar to the logic truth table exercises I learned in ninth grade than the complex algorithms you hear mentioned so frequently by programmers. Knowing whether an evaluation is true, false, or nil and how my programming language specifically treats each state is the extent of the "math" I do regularly. Occasionally I've had to calculate discounts or sales tax, but that's less mathematical than managing a cash register at a restaurant.
Besides, computers are way better at math than you are anyway. By learning to program, you'll learn to let them handle it for you.
Now there is clearly some truth in this quote.  I haven't felt the need to pull out a trigonometric or  calculus equation during my short professional programming career.  Unless I start doing something geometry related I might never do so.  Command of natural language is probably the most important skill anyone can develop.  The rest of the blog post is truthful as well.

But I don't agree that with the subtext of the quote that math class stopped being useful at ninth grade or that math programmers do regularly isn't complex.

I apply college level discrete mathematics and logic coursework to my programming everyday. Do I break out the formal notation? Sometimes, but unfortunately not usually. However, just because I use informal notation (pseudo code) or work out the problem in my head doesn't mean I didn't do any math.  It just means I didn't properly show my work.

I think the mathematical logic I use is fairly complex and took a fair amount of time to obtain my current level of mastery. Set operations and data transformations in singular instances are well within the purview of laymen. Chaining multiple instances of both is something that takes some practice. You may not understand the formalities and rigor, but you do develop a feel for discrete mathematics and logic as a programmer.

You could argue that set operations and data transformations can be abstracted away. That the remaining model is simple, no complex math required. I'd say you were fundamentally wrong.

Abstractions are a tool to manage complexity, not reduce it. Complexity of a problem is constant with respect to static requirements.  The complexity of the solution may change, but the required inputs and outputs remain the same.

If I have 1,000 set operations required to come to a desired result (output), it is decidedly more complex than a program which requires only one.  Even if I abstract the 1,000 down to only a handful at any time complexity remains.  Logic is not constrained to individual IF blocks or JOINS. It is the entire sets of possible input transformed into the entire sets of possible outputs that define the program.  Your program may give intermediary output in the duration, you may have abstractions to conceptualize layers or components of the system, but fundamentally you are operating on a state machine at there beginning and an end (or cycle).

That is not to say that abstractions don't have a place in every programmer's toolbelt.  It just happens they do because they are a powerful application of discrete mathematics and/or logic. For example, chunking a large set operation into manageable pieces is discrete mathematics.

Example: Login
((E U P) ^ R) ^ S = A
((Email Union Password) Intersect Users) Intersect Session = Authenticated Session

Authenticated Session is an abstraction. This abstraction will be used later in other set operations, probably in and on other abstractions. Together they will form a complex mathematical construct, even if you never think about them that way.

Example2: Login with additional abstraction
E U P = C
Email Union Password = Credentials
(C ^ R) ^ S = A
(Credentials Intersect Users) Intersect Session = Authenticated Session

The complexity of the problem has not changed (mapping of inputs to outputs), but the additional abstraction allows us to mange the complexity.

I hope the above is suitably demonstrative of applied discrete mathematics in programming. I would think most programmers could have arrived at the solutions by intuition, that is to say do it in their head or by instinct.  I'd argue this is because they are very good at discrete mathematics.

The point of my argument is that my formal education in computer science placed an emphasis on discrete mathematics and logic, which are true mathematic disciplines. While I do not employ the rigor or formality, the concepts are very useful in my work.

My other point is that I use these types of complex math *all the time* in programming, even when I do not explicitly show my work.  Don't sell yourself short as mathematician if you are a programmer.

Gaming: Alien Swarm

I put this game down a while ago, but the concept was interesting enough that I thought it merited comment.

Alien Swarm is a top down, 3D, co-operative multi-player shooter in very similar vein as Left 4 Dead.  It also looks a whole lot like the new Laura Croft and the Guardian of Light, a game that costs $15.  Alien Swarm provides a simplistic interface, but also includes editor and scripting tools allowing 4 players at play at a time.  The game really requires a full contingent to enjoy fully, although bots can be enabled through the scripting tools.



Unlockable weapons and upgrades, four different character classes, and cross-game achievements made for great way for Steam to get a few extra installations of their software to the masses.  For the price, it is worth your time.

If you haven't, check it out on Steam.  http://store.steampowered.com/app/630/

Logon Screen



Windows 7 has a lot of things to offer, especially if you've got recently purchased hardware.  But even with all the bells, whistles, and features from Vista that finally work right, it still could use a few more built in power user style options.  One change that I was very happy to make not long ago was to my home machine's logon screen.

I borrowed some World of Warcraft icons for my user logins and the picture below to give myself a nice system metaphor.  The Tweaks.com logon changer is a pretty straightforward program, so I'll let the screenshot speak for itself.


Below is a link to the logon screen changer.
http://download.cnet.com/Tweaks-com-Logon-Changer/3000-2094_4-10911825.html

Teaser Post: Social, Political, and Financial Capital

An idea that's been floating around in my head for a few days has been the different types of "capital", particularly as they relate to gift economies.  This is particularly interesting to me because open source communities and increasingly even modern development departments operate as gift economies.

Why is this important?  Because it means you have resources your balance sheet doesn't reflect, resources that can be transformed into financial rewards or help you achieve goals that are orthogonal to normal business operations.

And that's all I'll say about that... for now.

Salvaging the Anti-Pattern: Smart UI

I've been reading the first couple of chapters of Steve Sanderson's MVC 2 book. I haven't learned much about MVC from it that I didn't know from Rails, yet. It does have a decent discussion of XSS and the .NET 4 features to make it less common.

What really caught my interest is the discussion of the Smart UI anti-pattern. This is something I definitely feel I've been guilty of. Using this anti-pattern stems from two beliefs of mine:

One, both client and server side validation should be present. The server has to have it because the client may be malicious. The client should have it because it shouldn't have to do a network round trip to find out fields were required or formatted incorrectly. If I don't need to go the database to validate, I probably don't need to go to the server (but afterwards I will make sure you played fair).

Two, clients should display an elegant and concise UI. Often this mean hiding inputs and information until it is needed. Inserting the necessary logic to do so however creates quite a mess of event handling code. It also makes my code more fragile, since changes in the domain logic now require changes in the event logic as well.

I'm sure there is a clean way to import validation and input relationship logic into the UI without using clipboard inheritance from the domain, but I haven't found it yet.

Busy Week

I've been busy this week.
  • Got my feet wet with ASP.NET MVC.
  • Took a more official role in my local Java Users Group.
  • Bought my first house. //Here's the problem.
I hope to put a more sturdy line up of posts next week.

On a more relevant note, I've added my Stack Overflow profile in the sidebar. If you haven't heard about Stack Overflow, or just haven't used it, make sure to take the time to check it out. It takes some of the best aspects of slashdot.org style community based moderation and applies it with full force to the technical FAQ genre website. Even the creation of new FAQ sites under their umbrella company, Stack Exchange, is handled via a community moderated technique. Very cool use of crowdsourcing. I'll see you there!




Code Puzzler: T-SQL

Problem:

Common Table Expressions (CTE) are a really cool recent addition to my vocabulary. Operating a lot like a temporary table, they only last for the duration of the query and clean up after themselves.

Another cool idea is string concatenation within a SELECT statement. Together they make some interesting code.

So we had some code that looked something like this:

;WITH Person as ( --This is where we kick off the CTE
SELECT @STR = @STR +
CASE E.FirstName WHEN ''
C.FirstName --Remember this line.
ELSE
E.FirstName
AS 'FristName'
FROM Employees E
JOIN Contacts C ON E.Email = C.Email
ORDER BY
FirstName
)


An elegant solution for a more civilized age. The string concatenates the correct field while the CTE loops over the tables all without the use of a cursor.

Puzzle:

This code would work, except we care about order. And order and string concatenation don't mix, at least according to the following knowledge base article.

What's interesting is that the query doesn't blow up, it just acts...weird. Like returning on the last thing to be concatenated. Or not causing any problem at all. Remember the line I marked above? If I set it to a string literal, the code operates normally. Otherwise, weirdness.

Solution:

Dump it all into a temp table to order it. Of course you lose your nice tidy code that way, but it works. At least you can say you tried to use a CTE.

If you have a more elegant solution, please post it below in the comments. I'd love to hear it.

Ongoing Mystery:

So what actually is happening with those queries where the undefined behavior hasn't bitten me, yet? Do tests for multi row result concatenation conclusively tell me whether I've missed the error. Or is the weird undefined behavior dependent not only on query structure but also table contents?

Display Fusion

I get plenty of stuff done at home on a 17" monitor. It meets all my needs, services all of my requests. It has done so now for many years. I've got a 22" monitor in a box waiting for a desk that can hold it. That's a bit sad but I'm in no hurry to put down the cash for the furniture.

Imagine how I feel every day coming into work to two 22" monitors. Pure bliss, that's how. Display Fusion is a utility that takes that bliss and smooths out any wrinkles from the lack of advanced Windows support for multi monitor setups. I'm just using it for a seamless desktop background across two monitors right now, but additional options abound.



A great deal of those options, such as hot keys to send a window to another monitor, are available in the free version. A trial of the paid version is available and it only cost $25 to purchase. That's a lifetime license, so there's no additional cost for new versions. If you go multi monitor, check out Display Fusion.

LinkedIn

I'm throughly perplexed about the machinations that allow one social network to dominate another. The question of how to obtain and maintain a user base of millions of customers is one I don't think a good answer exists for.

LinkedIn is one of the few I think actually has a chance at answering the question. It answers the initial questions of delineating access level and social graph noise by focusing on professional relationships. You don't wonder if your boss is looking at your LinkedIn profile, you want them to. You can request recommendations, list qualifications and professional associations, and network with potential partners.

This strong sense of purpose I think will make LinkedIn a contender for survival in the social networking sphere. You can catch my profile there, drop me a line, or check out my professional history.

Review: 1 Month

While the real 1 month anniversary of the creation of this blog isn't for a couple of weeks, the event that spawned its creation has passed that milestone. Namely, my first day of work at my current job.

Scratch

A while back I mentioned Scratch as one of the things I used to kindle my programming career. It is said that in order to truly understand something you have to teach it. Scratch is a wonderful teaching tool for programming.



Scratch allows new programmers (often kids, but not always) to create sprite based interactive content (i.e. games) easily. Programming blocks such as if statements, variable assignments, and events snap together into scripts like Lego(tm) bricks.

I created a dozen games for a gallery to show off concepts and explore mechanics, both in technology and game mechanics. I then made a couple of presentations to teach those ideas to group of teenagers for an event.

Scratch makes a great tool to turn some fun time into easily understandable demonstrations of programming knowledge. It can be read by someone who's never programmed and entertain the veteran. It was such a simple resume addition that I'd suggest everyone in the programming field take some time with it, you'll probably like what you create with it.

Gaming: Starcraft 2 Release

Starcraft 2 is being released today. I probably won't be playing it tonight. Here's why.



I preordered Starcraft 2 several weeks ago and participated in the Beta. I loved it from first marine. Almost everything there was to enjoy in the original was available, either directly or as a reinvisioned counterpart. For example medics and dropshops are combined into medivacs, dune buggies wield fierbat style flamethrowers, wraiths are divided into vikings and banshees with each being decidedly better at a specific style of gameplay than their predecessor.

New units and the cliff jumping mechanic add another dimension to the tactics already well known by Starcraft players. The game feels exceptionally well balanced and I have no doubt it will continue to improve in future installments and patches. If this game is so wonderful why am I abstaining tonight?

Network latency. While I could rant against Blizzard for under developing their network capabilities, I know inside this probably isn't true. More likely it is a problem of economics. If the game only uses 50% of the network resources during normal prime time, how do you justify the increased capital costs for a release activity spike, a statistical outlier? It can work 99% of the time (1 day of downtime a quarter i.e. patch days) at a fraction of a cost of 99.9% uptime (9 hours of yearly downtime i.e. product release).



So I'm going to patiently wait 24 hours for the flash mob to pass before firing up my retail client. Then watch out ladders, here I come.

Why I'm Here: Part 2

When we left my life story last I had accepted a job in IT support for the local library. Economics downturns loomed unseen over the horizon and programming jobs were sparse and getting sparser. How did I weather the storm?

In retrospect it is easy to say I did poorly. I could have contributed to any number of open source projects for the requisite experience, but it felt like an impossible task. Open source still does in some ways, merging into an existing workflow with people you've never met in technologies you've never used.

Bounce your http request off this!


At the time the job search felt tremendously difficult. Programming jobs didn't land in my lap like IT support ones did. "Two years experience" were dreaded words. I tried a number of websites and technical recruiters. It took nearly a year and half to land my first interview. The job offer was made and within days was rescinded. The employer had lost a client who represented half their business.

Disappointed I left the recruiter and job websites. I spent the next year posting resumes directly to company and government listings. No bites, not even a nibble. Opportunities for promotion within my current employer appeared nonexistent.

I eventually got myself involved with my local Java Users Group. I began playing with Perl and Ruby during my free time. Concepts like Model, View, Controller that were barely covered in college crept into my understanding. Software testing tools came onto my radar, even if they still don't saturate my process. I put together a website to stretch my knowledge of PHP, javascript, HTML, AJAX, forms, and SQL. At work I got a chance to teach kids to use a introductory programming tool called Scratch. I wrote a novel, a personal life goal.

One day the recruiter who sponsored the Memphis JUG listed a entry level programming job with the group. I applied, my presence in the meetings sparked a recognition, my website feed their desire to know more. Those little things I had been doing the past year kindled my degree into a finally respectable application. I applied, interviewed, interviewed, and interviewed. Again I was offered a position, but this time with company whose client base was broad enough to survive any momentary lapse in funding.

I accepted and put in my two weeks notice. I felt so eager to be at my new job, I worried I was building it up to much. But so far it has been more than I hoped for and it doesn't look to be letting up anytime soon.

iPhone vs. Android

A house divided cannot stand.

Well, not really. My household was split along the Droid/iPhone divide for months as we used work provided smart phones of differing heritage.

I spent my work time on the Verizon Droid.

While my wife happily plugged in her AT&T iPhone 3GS.



With my new developer job came a new phone, sort of. I get a stipend to spend on cell phone service, so I get to pick and own the phone. Our personal cell phones, home phone, and internet service is already through AT&T. Since I don't expect to be accepting nearly as many work related calls, I'm thinking about doing both personal and business calls off one device. Hence my provider is preselected.

AT&T gives me the option to go iPhone or Android and each have recent additions to their line ups in the iPhone 4G and Samsung Captivate. I have a dilemma.

I appreciate Apple's choice to provide an end to end solution and apparently developers at large do to. This is pointedly obvious with the iPhone exclusive app "Words with Friends", a Scrabble(tm) clone that would probably be only game on either device I'd purchase if it didn't already come with an Ad driven free version. A larger user base could also help sell any apps I may one day develop. The forward facing camera has potential as well.

However, I appreciate Google's relaxed market rules. The horror stories of iPhone app applications gone awry make me concerned about what might become of my first attempt to do cell phone development. Also I make frequent and extensive use of Google's services, such as Google Voice, which are tightly integrated with Android and sometimes completely unavailable on the iPhone. Unfortunately the Captivate does not include an LED flash, a travesty with a 5 mega-pixel camera.

I was thinking the integration with Google services is going to end up being the killer app for me. The features of the iPhone are enticing, but I don't see myself doing any video conferencing. What I do see myself doing is taking pictures. A missing $10 LED flash is going to drive my purchase of a $200 phone.

w3schools

One of the reference websites I got a lot of use out of even before I started my current position was W3Schools.

W3Schools is a free site, low noise and high signal. It covers a large swath of technologies, but they are all applicable to someone creating web applications. I had learned HTML from a great reference book from HeadFirst labs, but the tutorials on W3Schools were essential. They are easily referenced from anywhere and help easily demonstrate principles. Most tutorials give you a chance to try code out yourself, without leaving you with a bunch of text files to clean up or installing any tools, perfect for learning on shared machines. I picked up PHP almost exclusively with W3Schools. Even my work with PostGreSQL was greatly simplified by comparing it with the MySQL examples within the PHP examples.

Check out W3Schools if you have to do any web development. It is a great way to get started for a budding web developer.

Upcoming Travels: devLink

I'll be attending devLink in Nashville, TN on August 5th-7th.

I'm really looking forward to what will be my first developer's conference. In particular the sessions on how Windows 7 was so dramatically faster than Vista and building a Google Contacts app in Silverlight both are peaking my interest.

If you're doing any development with Microsoft tools and technology, you should take a look at this conference. For those already planning to attend I look forward to seeing you there.

Why I'm Here: Part 1

I mentioned in a previous post that I've started my first development job. Let me tell you why this is a big deal for me.

I've been into computers for a long time. My father installed my first computer game before I was eight. He didn't install the second, I did. Any games, drivers, patches were all my responsibility to figure out if I wanted to play. Eventually hardware became my concern as I was the expert on it as well in the family. While I've always been decent at what I'd collectively call support services, they were never the payoff. They were just work to get to the functional software experience on the disk (and later on the network).



For some reason, my first high school didn't put college bound students into programming classes. That seemed to be cordoned off for tech school kids. I knew I was interested in programming, but I didn't think I had access. Luckily, I applied to an academic magnet that did give everyone the ability to get into programming. Two years of high school C++ were followed up with four years of bachelor's degree in Computer Science, mostly taught in Java.

Throughout high school and college I continued to provide support services to employers, friends, and family. When I graduated college I had a split personality resume, education in programming and experience in support. And I couldn't find a job in either. Instead I found jobs making sandwiches, selling jewelry, and packing boxes. Eventually I found a decent wage providing support services for a library system. I had just gotten married and was eager to provide a reasonable income to my new household.



Little did I know, one of the worst recessions was about to land on the US economy and lock me into that position for three years.

Code Puzzler: jQuerry

Problem:

Earlier this week I came across some quirky behavior in jQuery. Pseudo code is provided below:


<input type="text" class="inputClass">An input</input>
...
<tr class="trClass">Row containing option dependent on input</tr>
<script>
$('.inputClass').change(function(){
if($('.inputClass').val() > 0){
$('.trClass').show();
}
else{
$('.trClass').hide();
}
}).change()
</script>



Seems simple enough. jQuery binds a function to the changed event and fires it off once on load to set the default behavior.

Puzzle:

It works on page load. It works the second and following times the input is updated.

It does nothing the first time the input in changed and loses focus. As far as we can tell change doesn't fire at all.

Solution:

After puzzling after this behavior for more than should have been required, chasing down the event with alert statements, .ready(), and .blur() events on load to try to initialize or eat the first user initiated .change() we call in the senior programmer. Five minutes later he's done.

He changed all the .change() events to .blur(). The missing update fires .blur() normally.

Ongoing Mystery:

We still don't know if .change() was being eaten by something else of if .change() just doesn't work correctly with text input. More importantly, we don't have a good way to tell.

If you do have a good way to tell, include it in the comments below.

Why We're Here

Two weeks ago I started my first software development job.

You're Hired!


It had always been my intention to start a blog immediately after starting so I could document all the things I was learning. It would serve as a pick me up if I ever felt like I wasn't making progress. I could always look back at my blog and say "Look, an artifact of progress!"

Slow progress has not been the problem.



During my first two weeks new technologies I have learned what currently feels like an absurd number of new things. Aspects of a new language, a source control program, a diff tool, a SQL implementation, a wiki editor, a jQuery plugin, and bug reporting software were comparatively easy additions. Over half a dozen new passwords threaten to overtake my memorization abilities. I can remember the passwords themselves, but matching the service to the password is sometimes tedious. Server (and employee) names also escape me frequently.

What takes up the most time is sifting through tens (maybe hundreds?) of thousands of lines of (new to me) code. Figuring out how it all interconnects, in software dialects I haven't read before, is the true challenge. Like filling out a crossword puzzle in Sanskrit, making sense of all these pieces is a puzzle only for the most determined or foolhardy. Luckily I've been guided by the existing development staff, but even among them some of the code is a mystery. Signposts have been worn away by the passage of time and additional development, deprecated code lays in the repository like snow drifts filling a mountain pass.



That said I still think I can get some use out of this blog and I hope you can too. In my future posts I might explain how.