<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Jeff Vroom's Blog</title>
	<atom:link href="http://blog.jvroom.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jvroom.com</link>
	<description>Topics on efficient software, Java, Flex</description>
	<lastBuildDate>Thu, 09 Feb 2012 04:14:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.jvroom.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Jeff Vroom's Blog</title>
		<link>http://blog.jvroom.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.jvroom.com/osd.xml" title="Jeff Vroom&#039;s Blog" />
	<atom:link rel='hub' href='http://blog.jvroom.com/?pushpress=hub'/>
		<item>
		<title>Debugging Hard Problems</title>
		<link>http://blog.jvroom.com/2012/02/08/debugging-hard-problems/</link>
		<comments>http://blog.jvroom.com/2012/02/08/debugging-hard-problems/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 01:20:54 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
		
		<guid isPermaLink="false">http://blog.jvroom.com/?p=100</guid>
		<description><![CDATA[The complexity of the solutions you can build is limited by the complexity you can debug. When code gets complex, debugging gets harder. More data is involved, setup is more difficult, problems harder to reproduce. Code paths are more complex. Data structures become unwieldy nested graphs. Stack traces many hundreds of frames deep. Multi-threaded timing [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=100&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The complexity of the solutions you can build is limited by the complexity you can debug. When code gets complex, debugging gets harder. More data is involved, setup is more difficult, problems harder to reproduce. Code paths are more complex. Data structures become unwieldy nested graphs. Stack traces many hundreds of frames deep. Multi-threaded timing problems, deadlocks, and intermittment errors. Do you yield at this point or do you dig in and find and fix the problems? If you walk away in fear, your system faces failure or at least may live as a buggy, hated thing people want to replace, instead of a solid, stable system that runs for years.</p>
<p>One of the reasons I&#8217;ve been successful in my career is that I&#8217;m good at debugging the hard problems. I&#8217;m not afraid to tackle a more complex design as I am confident I can solve the more complex problems that will arise. When working with teams, I can save a lot of time by helping others find those problems that can suck up days and weeks often in much less time.</p>
<p>I&#8217;ve wanted to write a post about debugging for a while but it is a dauntingly complex problem, worthy of a book. I learned most of my tricks by sitting over the shoulders of great programmers while they debug problems. I&#8217;ve learned over the years that there&#8217;s no substitute for taking an intuitive approach in the time savings involved. Even with a list of the many things you to find a problem, the secret is applying them in the right way at the right time.</p>
<p>Despite the difficulty, I took some time to write down some approaches I&#8217;ve found useful over the years:</p>
<ol>
<li>Have the right attitude. You will find the bug, it&#8217;s only a matter of time. The more frequent a bug occurs, the easier it is to find because of all the data gathering opportunities. The longer between occurrences, the more time you have to prepare for the next occurrence so you can catch it.</li>
<li>Familiarize yourself with all of the processes, threads, data structures involved.</li>
<li>Even if you can&#8217;t easily reproduce the bug in the lab, use the debugger to understand the affected code. Judiciously stepping into or over functions based on your level of &#8220;need to know&#8221; about that code path. Examine live data and stack traces to augment your knowledge of the code paths.</li>
<li>When you can&#8217;t reproduce the bug, you may need to instrument the code with additional logging. Make sure the skeleton of major operations has adequate logging to understand what&#8217;s happening in the system. Investing some effort in improving the targeted quality, readability of these logs will go far in the overall lifecycle of a complex system. Too much logging swamps performance and hurts readability. But with time-stamps, user-ids, user-agent strings, session-id, basic operations, you learn a lot about the running system and why it might have failed for one particular user. Logging is crucial for multi-threaded interactions.</li>
<li>Generate theories as to what might be causing the problem and test those theories. Keep an open mind. Generate as many theories as possible before you start the longer process of testing those theories. You may decide to test more than one at the same time.</li>
<li>If you have no theories, you need to learn more about the system, particularly information relevant to the code paths causing the bug. Adding additional logging is a good way to do that when sporadic errors cannot be reproduced.</li>
<li>Familiarize yourself with all of the layers of the system, at least at an intuitive level, from the hardware on up. This will help you visualize what&#8217;s going on in in your mind&#8217;s eye so your intuition can help steer you towards the most likely source of the problem.</li>
<li>For certain types of complex code, I will write debugging code, which I put in temporarily just to isolate a specific code path where a simple breakpoint won&#8217;t do. I&#8217;ve found using the debugger&#8217;s conditional breakpoints is usually too slow when the code path you are testing is complicated. You may hit a specific method 1000&#8242;s of times before the one that causes the failure. The only way to stop in the right iteration is to add specific code to test for values of input parameters. Aways do a System.out.println or log some visible, unique consistent token.   This makes it easy to find and remove these code snippets when debugging is complete. Once you stop at the interesting point, you can examine all of the relevant state and use that to understand more about the program.</li>
<li>Some people start out by drawing pictures, flow charts, entity-relationship diagrams of their data structures, and detailed state tables. I will do this only as a last resort or for documenting the project as it is time consuming. Examining a real instance of that data structures in the debugger is much faster, more accurate and more informative than any diagram. The JavaDoc or structured code browser are enough for me to understand the entities and relationships. I try to visualize data structures in my head and only resort to a drawings, or state tables when necessary. I think that over time, this has made me faster at visualizing and building systems.</li>
<li>If you get stuck, take a break. Sleep on it, approach things fresh the next day. You may not have enough information and may need more to get the next piece of the puzzle. Too much frustration impedes your motivation and ability to focus. For the best debugging approach, you need to research all relevant aspects of a system, simulate that all in your head, use your intuition to flush out ways things could be going wrong. Instead of trying to find the problem, perhaps you need to learn more about the failure.  Under what conditions does it happen?   What&#8217;s unique about those cases?  How can you learn more about those unique code paths?</li>
<li>Do not spend too much time on minor bugs but do keep in mind the value of true reliability in a system.  Your pride is not relevant.  Your customers&#8217; experience in using the software is all that matters.</li>
</ol>
<p>If you become good at debugging complex problems, your confidence as a programmer will grow, letting you tackle bigger, more relevant problems. When things go wrong, you&#8217;ll be able to step up and make things right again.</p>
<p>Did I miss any of your favorite debugging tips?  Continue the discussion in the comments!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=100&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2012/02/08/debugging-hard-problems/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Choosing Your Programming Language &#8211; The Inside Scoop</title>
		<link>http://blog.jvroom.com/2012/01/28/choosing-your-programming-language-the-inside-scoop/</link>
		<comments>http://blog.jvroom.com/2012/01/28/choosing-your-programming-language-the-inside-scoop/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 21:09:07 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=94</guid>
		<description><![CDATA[Many programmers prefer typeless, interpreted languages like PHP and Ruby for several reasons. They are more concise and easier to read and write for a novice. They tend to be interpreted languages, not compiled, which are simpler to use and typically offer faster round-trip time between making a change and seeing the result. They support [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=94&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Many programmers prefer typeless, interpreted languages like PHP and Ruby for several reasons. They are more concise and easier to read and write for a novice. They tend to be interpreted languages, not compiled, which are simpler to use and typically offer faster round-trip time between making a change and seeing the result. They support a &#8220;google, cut and paste&#8221; type workflow more easily which, frankly is how many programmers operate these days.</p>
<p>And yet still strongly typed languages are more wide used, particularly as the complexity of the project and the number of the developers grows. I have discussed this issue with a number of colleagues and wanted to write down my thoughts. It&#8217;s important to choose the right language for the right job and today unfortunately, there&#8217;s no one size fits all answer so knowing the details may help.  My opinions were formed by poking around into the guts of the JVM, Python, PHP, Ruby, and Flash interpreters, and from coding in Java, C, and C++ extensively.</p>
<p><strong>Typeless versus Typed</strong></p>
<p>One reason I believe typed languages are used is the robustness of the code itself. Typeless languages offer a single-point of failure with each code construct. If you misspell a variable name, you do not find out until runtime and only by debugging the problem or through code inspection. With a typed language, each misspelling is caught at compile time because every name must occur in the program at least twice, once for the type definition, once for the usage. This fact alone will often make up for the extra key strokes you need to use in a typed language.</p>
<p>With typed languags, more is known about the system during the code editing process. This makes the tooling opportunities richer and reduces keystrokes which can make it faster to write code in a typed language than an untyped one, even though the typed language is more verbose. For example, handling imports, completion of member or method names. The &#8220;find all usages&#8221; feature is extremely valuable at tracing code paths and doing refactoring. Typeless languages may offer such features but they are much less specific as they must do only name matching, not type+name matching. The ability to change a field or method name and reliably update all references is a big time saver when modifying a large existing project.</p>
<p>Another reason people prefer typed languages of course is runtime performance. But why exactly do typed languages run so much faster? The biggest reason is that they offer a much faster way to evaluate &#8220;a.b&#8221; expressions and do method lookups (a.b()) at runtime. With a dynamic language, every single indirection requires a hashtable or binary search which turns into dozens or 100s of instructions. With a typed language, a compiler can frequently generate an &#8220;a.b&#8221; with just a few instructions using a &#8220;load from fixed offset&#8221; pattern. That&#8217;s why a typeless language will run usually at least 10X slower than a typed language no matter how many engineers Facebook puts on the problem.</p>
<p>Some folks today are trying to infer types in typeless languages to improve runtime performance. In limited cases they could compile typeless code to use fixed offsets. That may well be an area of research which could improve the performance of some typeless code. I suspect though that the code which will speed up will need to be well organized around common types and so written a lot like a typed language.</p>
<p>It also perhaps poorly understood that even typed languages do not always realize the a.b speedup for using fixed offsets. For example, when you use a feature like interfaces in Java, you do end up with some searching to find the right method in the general case. You may not see this all the time because Java employs a trick to cache the offset for the last type seen which sometimes eliminates that search in many cases. I have a project in which changing one interface to an abstract class improved performance by over 50%.</p>
<p>One other poorly understood performance factor in comparing typeless and typed language is when interpreted code calls native code. For example when PHP or Java calls some C function. Native transitions are usually substantially slower than normal method calls because of the extra work they need to do in translating data types, pinning down memory used by the native code, copying memory from an unmanaged to managed environment etc.</p>
<p>Though both typed and typeless languages suffer the same problem, in general typeless languages use more, higher level C libraries. That&#8217;s probably because writing them in the language itself is too slow or just the effort involved in writing the code itself is too high given the limited commercial support for typeless languages. With more native transitions, the performance hit for this design increases so just moving more code into the native layer may not make things faster when you need to make lots of native method calls.</p>
<p>Of course more use of native code turns into an advantage when you have a small amount of typeless code which just strings together a few efficient but long running native methods, like copying a file. In these systems the typeless language is almost as fast as C.</p>
<p>In general typeless languages have faster round trip times between changing code and seeing the change. Because they are typeless, when you update a module, you do not have to update the entire application. Changed code constructs can co-exist with unchanged constructs. In a typed language however, you have to update the type in a way that preserves the stricter typing contracts. Since the code itself relies on fixed offsets, when those offsets change, you have to update all of the code atomically which is hard to do and get right. Most typed languages cannot do that seamlessly and worse still, there&#8217;s no way to know when it will or won&#8217;t work making &#8220;Class patching&#8221; useful only in special cases where you can isolate all dependencies on that class that is being changed.</p>
<p><strong>Interpreted versus Compiled</strong></p>
<p>To get good performance as a project grows, even interpreted languages these days must cache compiled descriptions of the code. They do however retain the ease of use benefits in most cases because this is all done transparently, by the browser or the runtime engine. When the code changes, these caches are updated automatically. Without such a feature, interpreted languages bog down as code sizes grow. Each time a process restarts, too much code must be interpreted before you can use the system.</p>
<p><strong>Thread Architecture</strong></p>
<p>Java, C, and C++ are all multithreaded using operating system thread scheduling. In general, this means that all code must be &#8220;thread aware&#8221; though in practice, frameworks try to reduce the likeklihood of thread conflicts. When a framework is well designed, the burden of synchronization is not imposed on application code.</p>
<p>You need a threaded architecture when you need to share a large pool of memory or efficiently perform I/O with a bunch of sockets or files. You can more easily leverage a multi CPU environment with OS threading.</p>
<p>In contrast, even multi-threaded VMs like Python may have a global interpreter lock or will do VM based thread scheduling. Either of these architectures eliminates opportunities to do parallel I/O unless you switch to a multi-process model. For example, PHP will run each HTTP request in a separate process and so achieves some form of parallelism that way. But in doing so, it eliminates the use of shared memory which reduces the efficiency of memory caching. It also means that any data structure used by all HTTP requests must be replicated across all PHP processes further increasing both computation and RAM usage.</p>
<p>So for PHP, you&#8217;ll need even more memory and more CPU to populate that memory. You do still benefit from OS level file caching of course.</p>
<p><strong>What about the Future?</strong></p>
<p>I tried to be neutral in my analysis but you can probably tell from the above that I like the benefits of typed languages. When you consider long term costs, and include modifications, enhancements, transfer of code between developers, runtime efficiency for either large scale or mobile deployments, strongly typed languages win out.</p>
<p>I agree however with Ruby and PHP developers that we are not there yet when any strongly typed language today will beat out PHP and Ruby for any given project. As long as the code is easier to read and edit for most people, the typed language advantages may easily be outweighed by availability of people, cost, and the poor workflows that exist between complex typed languages like Java, C, C++ for designers, analysts, and admins.</p>
<p>To bridge the gap, we need a strongly typed language which has:</p>
<ul>
<li>simplified tools &#8211; the Java IDE is too complex for entry level programmers and others who work with PHP and Ruby code today</li>
<li>syntax improvements to eliminate imports, use inferred typing, and in general simplify the syntax will bring typed languages much closer to untyped languages in readability/brevity.</li>
<li>mixed interpreted/compiled modes and a way to migrate code between them as it solidifies</li>
<li>updating of types for the common cases for immediate code updates. When that&#8217;s not possible the ability to know as soon as the code is changed that a restart is required.</li>
<li>built in compilation, dependency management for automated builds, updates, deployments. Maven, ant, and IDE configuration are too complex today.</li>
</ul>
<p>What do you think? Did I miss any important issues that affect your choice of a language? Let me know in the comments!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=94&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2012/01/28/choosing-your-programming-language-the-inside-scoop/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Tribute to Dennis Ritchie</title>
		<link>http://blog.jvroom.com/2011/10/15/tribute-to-dennis-ritchie/</link>
		<comments>http://blog.jvroom.com/2011/10/15/tribute-to-dennis-ritchie/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 03:09:10 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
		
		<guid isPermaLink="false">http://blog.jvroom.com/?p=87</guid>
		<description><![CDATA[I wrote my first serious program in Basic on an Apple II computer in high school. My dad had me running data at the Yale computer center using a program written for him by a grad student in Fortran. I did not like fighting for a terminal, hogging the printer and CPU with massive jobs, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=87&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I wrote my first serious program in Basic on an Apple II computer in high school.   My dad had me running data at the Yale computer center using a program written for him by a grad student in Fortran.   I did not like fighting for a terminal, hogging the printer and CPU with massive jobs, and dealing with the wrath of angry graduate students.   When we got our Apple II it seemed more than capable of taking on this burdensome task.   But even with the Fortran code in front of me, coding was the most tedious job I&#8217;d ever done.  The code started at the top and ended at the bottom.  Creating every aspect of the report required what felt like an enormous amount of code.  If I knew one thing in high school it was that I did not want to be a programmer.   </p>
<p>My first structured computer class in Pascal in college helped change all of that.  My superlative professor Andy van Dam taught me how to design code from the top-down, breaking it into pieces, reusing as much code as possible.  Thinking about how easy the code is to read, modify, and maintain, helped me view software as a design challenge, not a rote tedious process.   I was still on the fence about being a programmer.</p>
<p>When I learned C and Unix as a sophomore all of that changed.   The experience of moving from the heavy, bloated, inflexible set of abstractions in Pascal to the simple, machine-oriented, clean, flexible, concise abstractions in C created for me a new understanding of the incredible potential of software.   You can use software to not only build a system but transform a process.   It&#8217;s the power of not just solving a targeted problem, but solving the meta-problem.  The family of problems which make this particular system relevant and will ensure it stays relevant as we refine the system, or as processes evolves around the system forcing the system to adapt.   C and Unix established more efficient processes for building systems and for me opened the door to seeing that potential.  </p>
<p>As the designer of C and lead contributor to Unix, Dennis Ritchie&#8217;s impact on the world was and continues to be tremendous.   His work underpins not only the Mac, the iPhone but Android, Google, Amazon, Netflix.   His design sensibilities influenced not only C, but C++, Objective C and Java which together account for the majority of the code which exists in the world today.   Hs work helped me not only get into the business of programming but also inspired me to always keep thinking about how to make programming better.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=87&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2011/10/15/tribute-to-dennis-ritchie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Evolution of Forms (More about Why I left Adobe)</title>
		<link>http://blog.jvroom.com/2010/07/04/evolution-of-forms-more-about-why-i-left-adobe/</link>
		<comments>http://blog.jvroom.com/2010/07/04/evolution-of-forms-more-about-why-i-left-adobe/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 03:36:33 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Flex, BlazeDS, LCDS]]></category>
		<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=73</guid>
		<description><![CDATA[An article of mine about evolution of forms technology was published on The Register. The need for this technology is why I went to work at Adobe and why I left when I realized they would not market LCDS this way. BTW, Froyo &#8211; aka Android 2.2 update arrived on my Nexus One July 1. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=73&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>An <a href="http://www.theregister.co.uk/2010/06/14/vroom_forms/">article</a> of mine about evolution of forms technology was published on <a href="http://www.theregister.co.uk">The Register</a>.   The need for this technology is why I went to work at Adobe and why I left when I realized they would not market LCDS this way.</p>
<p>BTW, Froyo &#8211; aka Android 2.2 update arrived on my Nexus One July 1.  My phone runs Flash!  Congrats to my friends at Adobe for creating the first/best universal portable runtime for rich UIs.  As a stock holder, I just wish you had a better monetization vehicle for it (hint, hint).   Thanks Google for not being afraid of Flash, plus all of the great things you did with android: tethering, navigation, my tracks, maps, gmail, etc.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=73&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2010/07/04/evolution-of-forms-more-about-why-i-left-adobe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>MS and Oracle&#8217;s big dev tools &#8211; who needs &#8216;em?</title>
		<link>http://blog.jvroom.com/2010/03/02/ms-and-oracles-big-dev-tools-who-needs-em/</link>
		<comments>http://blog.jvroom.com/2010/03/02/ms-and-oracles-big-dev-tools-who-needs-em/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 19:55:35 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Flex, BlazeDS, LCDS]]></category>
		<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=68</guid>
		<description><![CDATA[My article on the register.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=68&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p> My article on <a href="http://www.theregister.co.uk/2010/02/28/ides_versus_the_people/">the register</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=68&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2010/03/02/ms-and-oracles-big-dev-tools-who-needs-em/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>It&#8217;s Gotta Be Git</title>
		<link>http://blog.jvroom.com/2010/02/27/its-gotta-be-git/</link>
		<comments>http://blog.jvroom.com/2010/02/27/its-gotta-be-git/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 17:36:40 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Flex, BlazeDS, LCDS]]></category>
		<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=61</guid>
		<description><![CDATA[Source control plays an essential role in software engineering.  I&#8217;ve been using it ever since my first job and it transformed how I code.  But like every tool it seems, it can be your best friend or at times your worst enemy.  Most painfully, CVS, SVN and P4 for example all are terrible at merging [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=61&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Source control plays an essential role in software engineering.  I&#8217;ve been using it ever since my first job and it transformed how I code.  But like every tool it seems, it can be your best friend or at times your worst enemy.  Most painfully, CVS, SVN and P4 for example all are terrible at merging a branch the second time.  They lose track of what was already merged and start registering false conflicts.</p>
<p>At Adobe, on some complex projects during lockdown you&#8217;d have to coordinate with someone before each checkin.  He&#8217;d bracket batches of commits with tags, then carefully merge a set of deltas one batch at a time.  Not a fun job &#8211; everyone&#8217;s waiting on you, while you are trying to juggle lots of code you did not write at a critical juncture of the project.</p>
<p>The other time source control let me down in a big way was on my trip to India a couple of years ago.  Access to the source control system back in San Jose was so poor, it made me change how I worked &#8211; in a bad way.  I did not verify the diffs and checkin comments for affected code before making changes.  I batched up all sync/checkins during breaks (and yes took more breaks).</p>
<p>The reasons Git is superior:</p>
<h4>Local history, local branches</h4>
<p>I started a new project by creating a git repository on my local machine (git init, git add).  A few months later, I wanted to share the code with a friend.  I cloned my local repository into a bare repository on a hosted linux vps, then gave out that URL (git clone ssh://myserver.com/var/git/myapp.git).  Now I can &#8220;git push&#8221; and &#8220;git pull&#8221; changes to/from that remote server as needed to share or backup my work.  Each repository maintains the entire history of shared branches so even if there is a central repository, you use it less often.  When you have conflicts trying to push or pull, there&#8217;s one straightforward process to merge and resolve them.</p>
<h4>Stashing changes</h4>
<p>Occasionally you need to put work on hold to fix some other more important bug.  Git lets you stash away your changes in a temporary branch (git &#8220;stash&#8221;), do the fix, then bring your changes back with &#8220;git stash apply&#8221;, all without touching a server.</p>
<h4>Smaller checkins</h4>
<p>Because you can check in changes to your own repository without affecting others and without having to run the complete test suite, your checkins tend to be smaller which improves the quality of your version history.  At Adobe I was known for massive checkins sometimes with as many as 10 bug fixes.  That&#8217;s because the test suites would take an hour or more to run.  I could run them at most two times a day without interrupting my work.  Later this cost me time when trying to identify or merge a particular fix.  With Git you make checkins to your local project at natural intervals for history.  You push/pull at natural intervals for synchronization.</p>
<h4>Staging/Live Repositories</h4>
<p>On all but the smallest projects, you need a way to test environments that are isolated from active development prior to release.  Usually you tell coders to stop checking in changes during lockdown or you might create a branch and start merging.  Either way slows you down at the most critical phase of the project.</p>
<p>With Git you define a separate server repository for each level of isolation that is required.  You might have a development repository which developers sync to, a staging repository for testing primarily used by QA, followed by a live one that is used to mirror what is actually released or to be released.  During normal development, you might have staging automatically pull from development so QA stays on the latest.  But after lockdown, you turn this off.  QA can move changes as needed from the development repository into staging and sync that to live as needed.  Any developer can change their default repository and sync to either staging or live as needed when problems arise.</p>
<h4>No Waiting</h4>
<p>So far, I like the performance characteristics of Git.  Given the architecture, some things are faster, some things are slower but I suspect that since Linus wrote the core, most things you do day-to-day are faster even on large projects.  Version information is maintained per-repository, not per-file so getting the changes which affect an individual file can be slower &#8211; i.e. the &#8220;git blame&#8221; command (similar to cvs annotate).  But commits, push and pull commands have so far been very fast for me.  Despite the fact that Git does not store changes as &#8220;diffs&#8221;, but instead stores everything as a compressed blob file-chunks, space has not been an issue.</p>
<h4>Smarter Than You&#8217;d Expect</h4>
<p>Renaming a file?  Git figures that out automatically by comparing SHA1 hashes.  Git can even figure out when you refactor a big chunk of one file into another one.  It does fancy ascii-art during each push/pull to show you added/removed chunks.</p>
<h4>Verifies All Files</h4>
<p>Kernel programmers tend to be paranoid (a good thing).  Git verifies the integrity of all files using SHA1 hashes.  If any bit is out of place, it will barf with some cryptic error that may require a google search to fix.   But this has already paid off for me.  One problem I had with Git on windows was running it in cygwin without newlines getting destroyed (it only works in one of cygwin&#8217;s binary mode).  Git complained which prevented me from checking in any corrupted files.</p>
<h4>Flexible</h4>
<p>My favorite app server, <a href="http://www.caucho.com">Resin</a>, is now using Git behind the scenes to sync files across a cluster of servers.  I like that use since a) it is pretty fast, b) it makes it easy to make an isolated change on a live server while tracking that change robustly, c) you can check the history even on production, d) The verification comes in super handy here &#8211; any local changes can be detected and traced.</p>
<p>As with all new technology there are caveats.  Git is still fairly low-level, has numerous options and did not fully follow industry standard conventions (i.e to revert: &#8220;git checkout file&#8221;).  It takes more thought to set up repositories and workflows, and the two-phase commit/push process requires some mental re-wiring.  Because it is so flexible, people are still figuring out how to use it best for different purposes.  Since no one is making money off of git (except maybe github?), it is evolving fairly slowly in the &#8220;polish&#8221; area.  But from now on, for me it&#8217;s gotta be git.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=61&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2010/02/27/its-gotta-be-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Yin and Yang on Google&#8217;s China Announcement</title>
		<link>http://blog.jvroom.com/2010/01/13/yin-and-yang-on-googles-china-announcement/</link>
		<comments>http://blog.jvroom.com/2010/01/13/yin-and-yang-on-googles-china-announcement/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 08:21:53 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=52</guid>
		<description><![CDATA[Yin: uncovered corporate sponsored hacking, fed up by censorship Yang: no significant business in china, shore up credibility worldwide Bold move but I say well played.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=52&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Yin: uncovered corporate sponsored hacking, fed up by censorship<br />
Yang: no significant business in china, shore up credibility worldwide</p>
<p>Bold move but I say well played. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=52&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2010/01/13/yin-and-yang-on-googles-china-announcement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Flash on Mobile &#8211; is Adobe on the right track?</title>
		<link>http://blog.jvroom.com/2009/12/31/flash-on-mobile-is-adobe-on-the-right-track/</link>
		<comments>http://blog.jvroom.com/2009/12/31/flash-on-mobile-is-adobe-on-the-right-track/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 05:31:15 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
		
		<guid isPermaLink="false">http://blog.jvroom.com/?p=48</guid>
		<description><![CDATA[In reference to Aral&#8217;s article, Why Adobe’s mobile strategy is fundamentally flawed, I&#8217;ll have to back Adobe on the basic question at least. They have the right strategy just substantial technical challenges. I don&#8217;t believe the flash to standalone app compiler option will work for general flash apps. It&#8217;s a fine line between bundling a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=48&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In reference to Aral&#8217;s article, <a href="http://aralbalkan.com/2895">Why Adobe’s mobile strategy is fundamentally flawed</a>, I&#8217;ll have to back Adobe on the basic question at least.  They have the right strategy just substantial technical challenges.  I don&#8217;t believe the flash to standalone app compiler option will work for general flash apps.  It&#8217;s a fine line between bundling a VM and compiling a standalone app.  I suspect the swf&#8217;s they compile with the converter don&#8217;t use much of VM parts.  Apple is unlikely to let them move that line far enough to break their lock on iphone development. </p>
<p>
On the technical challenges for improving the performance of flash today, briefly: 1) scanline rendering and antialiasing made flash successful 10 years ago with superior graphics but I suspect we will need phones about as powerful as PC&#8217;s back then to make that efficient.  2) animation based apis based on polling as the default. 3) most flash code uses dynamic dispatch, and native method calls which impose hard limits on optimization.  These are all independent of how the VM runs and so limit how much a compiler can help anyway.  Couple this with an old code complex multi-threaded C++ program, competing needs for desktop and browser on top of the mobile imperative and you have a whopper of an engineering challenge.</p>
<p>
Adobe has great engineers working on improving the speed of this code but they can only do so much without creating an incompatible platform (and they have that already in flashlite).  They&#8217;d be lucky to get back to where today&#8217;s player runs as well as the one from 10 years ago given all of the features added since then.  Fortunately phones are almost where they need to be in terms of memory and raw CPU, unfortunately those computers were plugged in so they could use those cycles cheaply.  So on the positive side, it seems there&#8217;s still a chance for Flash to be the first/best viable cross mobile/desktop solution.  Personally though, I like Google&#8217;s Dalvik environment for the front runner in that race.  Dalvik is newer, designed for mobile from scratch, easy to make code portable to server and desktop, use hardware graphics acceleration for improved battery usage.  Java makes mobile/server interop easier.</p>
<p>
I do agree with Aral that we&#8217;ll see flash apps before we see flash in mobile browsers, at least enabled by default.  That&#8217;s another major technical hurdle on top of standalone flash apps and for mobile performance is king for the next few years.  But I do think for the mobile strategy at least Adobe is running as fast as they can and in roughly the right direction.  I hope the batteries have enough juice to get them there.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=48&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2009/12/31/flash-on-mobile-is-adobe-on-the-right-track/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Understanding the Market for Software Platforms</title>
		<link>http://blog.jvroom.com/2009/12/11/understanding-the-market-for-software-platforms/</link>
		<comments>http://blog.jvroom.com/2009/12/11/understanding-the-market-for-software-platforms/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 19:34:19 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Flex, BlazeDS, LCDS]]></category>
		<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=43</guid>
		<description><![CDATA[Like many software architects, I&#8217;ve built quite a bit of framework code in support of applications because the design patterns I wanted to use were not present in the core language.  As a software engineer who cares for the whole life-cycle of the products I build, I&#8217;ve always been looking for the best way to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=43&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Like many software architects, I&#8217;ve built quite a bit of framework code in support of applications because the design patterns I wanted to use were not present in the core language.  As a software engineer who cares for the whole life-cycle of the products I build, I&#8217;ve always been looking for the best way to get declarative programmers more involved in development and customization of applications.  In 1996 I had finished building a visual programming language called <a title="AVS/Express" href="http://www.avs.com/software/soft_t/avsxps.html">AVS/Express</a> with a sophisticated data binding system.  I realized AVS would never market it as a horizontal software tool and yet I was intrigued by the power these designs might have in the broader marketplace.  Like others, I believed Java would be the next big thing in software engineering and luckily found a great company looking to innovate in Java web platforms, <a title="ATG" href="http://www.atg.com">ATG</a>.  We designed a page template language, an IOC framework called Nucleus and a sophisticated ORM solution called &#8220;data anywhere&#8221;, all of which were keys to ATG&#8217;s success as both a platform and a customizable e-commerce solution.  Despite my advice to create horizontal offerings with these APIs, these remain high cost, five figure “enterprise” products and lost out to free offerings Spring, Struts, Hibernate when those were developed.</p>
<p>Today, ATG makes money regardless but their customers must spend a lot of money on headhunters given how many unsolicited phone calls and emails I get looking for trained ATG developers.  I bet their current e-commerce business would be even better if more developers were trained on their system.  I also suspect they are feeling saddled by a large platform code base to maintain that hinders them as much as helps now.  The cheaper stuff is evolving faster because more developers are using them.</p>
<p>I joined Adobe in 2005 because I believed they could push these design patterns into robust platform software that would get broad enough adoption to be successful.  With Flash/Flex they had a competitive UI but still were largely ignored by mainstream business engineering companies.  They needed server connectivity, round-trip UI to database tooling and improved standards compliance to really advance software engineering efficiency in a significant way among the corporate developers.  At the time I had come to believe that big companies were the best way to build software platforms because they could make large quantity, lower cost products successful and had the resources to plan for long-term investments.  It seemed like a perfect fit.</p>
<p>During the first Adobe internal developer&#8217;s conference I attended, the theme was &#8220;Platforms&#8221; and I was encouraged early on.  Sadly, I learned many lessons of big company politics that led me to learn their limitations when it comes to innovation.  In Adobe&#8217;s case, they are all about platforms on the client but when you get to the server, it becomes a political mine field.   When I was hired, I was told Flex would be much cheaper than its low five figure price at that time.  Shortly after I joined with the merger just starting things changed.  My product would have a free version but would cost an even higher five figured price for an unlimited one CPU clusterable license.  I never liked that pricing strategy but recently it just got worse.  They dropped the free version and raised the price on the unlimited version by another 20%.   For a set of tools so widely applicable (forms, persistence, etc.) and evolving elsewhere simultaneously that’s price will ensure other technology evolves more quickly to fill this need and Adobe loses their last/best monetization vehicle for Flash.</p>
<p>While I still believe I was right about big companies being the best places to evolve software platforms, I now see their limitations more clearly.   A big company has a complex political landscape and the deeply hierarchical management structure makes it more difficult to make good engineering decisions unless the leaders understand the vision.  Platforms combine standards with meticulous design and must include an efficient process for rapid evolution to ensure the success of its solutions.   Big companies will always be tempted to use their leverage and momentum to steer technology projects away from the path of efficiency towards a tactical advantage.  This type of decision making is the path to brittle and slowly evolving tools infrastructure.  To me software engineering is still engineering first and foremost.  We build mission critical components just like other engineers which become important public investments so corporate misdirection and bungling of technology advancements which harm efficiency particularly pains me.</p>
<p>I&#8217;ve spent the last 8 months part time researching the state of the industry looking for the next big language &#8211; the one like Java was in 1996 &#8211; that would help us make even better, more solid and maintainable software designs going forward.  I want maximum portability from mobile to desktop to cloud.  I want to leverage all of the language idioms we&#8217;ve all learned, leverage all of the library code we&#8217;ve built but improve the design integrity, flexibility and robustness of the designs.  I&#8217;ve looked at Ruby, <a title="Scala" href="http://blog.jvroom.com/2009/08/25/scala-review/">Scala</a>, <a title="JavaFX" href="http://blog.jvroom.com/2009/09/08/javafx-review/">JavaFX</a> &#8211; the three major contenders and found them all to be an unsuitable base from an engineering perspective for my purposes.</p>
<p>I&#8217;ve also found what I consider fragile support for each as well:</p>
<p>JavaFX: With Oracle taking over Sun, I believe that we have lost a major supporter of quality open source engineering languages and tools.  Oracle&#8217;s record of doing what&#8217;s right for engineering efficiency and promoting standards even if means potential loss of leverage is not good.  Sun was ok at best but it will in all likelihood just get worse from here.  JavaFX is not as open as Java and is not fully compatible with Java so it almost looks like Sun was trying to fork Java back into a proprietary language before the merger.  Can Sun help Oracle?  In my experience, Macromedia had a great affect on Adobe&#8217;s culture in terms of opening up engineering, raising awareness of standards and treating developers as an important constituency.  But at the end of the day, Adobe&#8217;s management determined what went down and that did not change after the merger.  I don&#8217;t expect Oracle to be more open than Sun or more successful at advancing such a core technology smoothly.  Their business unit managers like to make decisions about technology.  I have not met any Oracle BU heads personally but I feel like I know a couple of them because every meeting I&#8217;ve been at with Oracle starts with a discussion of their thoughts.  This is in contrast to Google where it appears like the engineers make decisions about which technology to use for a particular solution.  So I am not optimistic about JavaFX’s long term prospects to solve our core engineering challenges.</p>
<p>Ruby: A dynamic language, without strong typing has very little chance of ever competing on performance with a compiled language.  If you can&#8217;t turn &#8220;a.b&#8221; into &#8220;load from offset&#8221; and instead need a method call you are sunk from the get go.  I believe a language for writing languages is a great prototyping tool but a poor way to enforce design practices and build a single consistent language adopted by a broad community.   In terms of support, there is no one officially paid to work on the original Ruby runtime that most people use but there are paid projects trying to migrate them to Java and .NET.  Without compatible native plugins though, these efforts are guaranteed to fragment the community and so far have not helped really improve Ruby&#8217;s performance or toolability.</p>
<p>Scala: The best attempt yet to make an advanced functional language suitable for the masses but advanced functional languages are not suitable for the masses.  It seems that most of the interesting languages these days are coming from the academic world but I think academics have a different focus than commercial programmers.  Systems tend to be built and maintained by the same person in academia but in the corporate world, code will get handed off and probably to someone with less programming experience than the author.  Scala is also a language for writing languages &#8211; again a poor choice for mainstream engineering.</p>
<p>We are all used to free languages but this has left a void of credible language and tools companies.  JetBrains, one of the few has recently open sourced the core of their Java tool suite so that they can compete with Eclipse as a tools ecosystem effectively.   I hope their market is still solid so they can continue to innovate as Eclipse would not be nearly as good without them.</p>
<p>Google shines in this space, continuing to make incredible contributions across the spectrum.  They have yet to show that they are using their leverage unfairly.  You do not see them making corporate bets on any one language &#8211; they support Python, Java, C/C++ and have released two languages Simple and Go in the last few months.  Neither of these look particularly strategic to me. Simple is another visual basic-like language designed to help entry-level programmers be more productive but does nothing to improve their workflows with other types of programmers.  Go might be interesting as an alternative to C but like C only targets systems programmers.</p>
<p>I should mention IBM as they have been big supporters of open source projects in the past and I do think they&#8217;ve done a lot of good in the industry over the years.  But their challenge is that for any truly horizontal product, there are dozens of competitive efforts internally and so they are not likely to drive change as quickly as would benefit the industry as change for them involves considerable risk and retraining.</p>
<p>Along with researching the industry, I’ve also been building a new platform so the question of how best to market it in today&#8217;s climate is something I&#8217;ve been doing a lot of thinking about.   All I’m sure of is that it will not be easy.   We developers are tough to sell to.  We have a reluctance for lock-in, desire for all source, and complete control over every link in the supply chain without royalties.  The risk of going overboard of course is that we do not invest directly in those tools and lose out on competitive advantage to tools which improve our productivity.   For now, my project will be independent but I’m interested in any ideas you have for the best way to market platforms in today’s climate.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=43&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2009/12/11/understanding-the-market-for-software-platforms/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
		<item>
		<title>Tips For Buying and Selling Enterprise Software</title>
		<link>http://blog.jvroom.com/2009/10/29/tips-for-buying-and-selling-enterprise-software/</link>
		<comments>http://blog.jvroom.com/2009/10/29/tips-for-buying-and-selling-enterprise-software/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 17:24:36 +0000</pubDate>
		<dc:creator>jeffvroom</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Flex, BlazeDS, LCDS]]></category>
		<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.jvroom.com/?p=39</guid>
		<description><![CDATA[I&#8217;ve spent most of my career building frameworks which enable efficient delivery of large scale, expensive, mission critical systems.  These solutions usually have six digit budgets breaking down into license revenue, services and consulting to build the solution, and support maintenance and upgrades over time.  Because of the money involved, these types of solutions tend [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=39&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spent most of my career building frameworks which enable efficient delivery of large scale, expensive, mission critical systems.  These solutions usually have six digit budgets breaking down into license revenue, services and consulting to build the solution, and support maintenance and upgrades over time.  Because of the money involved, these types of solutions tend to drive a lot of the innovation in the software industry.  Unfortunately, just because a buyer in an organization has a large budget does not necessarily mean they know enough about software to make educated decisions on what they buy.  The complexity and number of variables in making such a decision is large: license cost, type and cost of developers to build the system, system maintenance and administration costs, etc.  Each solution in this space is unique and each vertical may have a relatively small market so getting reliable references is tough, particularly as it is likely these other customers are your competitors.  Further, I&#8217;ve noticed that when people spend a lot of money on software they are reluctant to be vocal about its failure.  The amount of money involved gives everyone skin in the game &#8211; buyer and supplier and so there are some pressures for people to try and cover up problems, hide the reality that some enterprise product’s customers are mostly unsuccessful or unhappy.</p>
<p>One thing about being in the industry a long time though is that you do see that quality prevails in the long run.  When an enterprise software vendor does get a public black mark in a particular vertical, it can be a swift blow that ends their market potential quickly.  I&#8217;ve seen a few recipes for long term success in selling to enterprise customers and a few recipes for long-term failure.  These may not be on everyone&#8217;s top-ten list when they are starting a company in this space but these are the qualities that in my experience ultimately differentiate the winners from the losers.</p>
<p>* <strong>Don&#8217;t ignore support and maintenance costs</strong>.  Your buyer is probably not too focused on how hard the system will be to backup, how often they&#8217;ll need to upgrade the software to deal with security threats, how difficult it will be to find programmers to extend and maintain the system but as their vendor you need to take care of these aspects for them.  You need to provide responsive support and need to have the ability to spin patches the very same day the bug is found.  In the frameworks I&#8217;ve built, support was encouraged to contact developers directly when they found what they believed was a serious bug.  The developer could often confirm or deny and possibly spin a test patch right away.  The systems allowed a quick way for the customer to drop the patch into a directory so it would be installed/uninstalled easily.  Since often support cannot easily reproduce the problem, the customer could usually be encouraged to test it directly to expedite the fix.  That willingness goes down the longer the patch takes.  Most of the time this lean process leads to the quickest possible resolution of the problem and a happy customer.  Of course if your first couple of attempts don&#8217;t work you need to get a test case but I found that 8 out of 10 support calls that would have led to escalations and messy processes wasting lots of time could be streamlined dramatically.  It also forces developers to readjust to quality over new features to ensure existing customers are happy first.</p>
<p>On the other hand, I&#8217;ve seen enterprise companies which discourage engineers from discussing bugs with the customer.  Every communication goes through a formal process involving some escalations team.  Further, in many cases, there is no patch mechanism.  Even a 2 line code change would have to wait for some massive roll-up patch, or would require a big investment in creating a special qualified patch.  The &#8220;upgrade&#8221; process could be employed to install each patch which made wholesale changes to the system that were not easily undoable and more problematic technically.  You can recognize these companies because they will deny the existence of bugs as a first reaction when you call support.   To them, to admit to a bug exposes the company to a liability.  Of course, the fact that your software has a bug is the real liability long term.</p>
<p>* <strong>Don&#8217;t ignore services revenue</strong>.  People selling enterprise software are usually in it for the license revenue.  You can potentially get much higher return on investment and are viewed by the market differently.  Customers also like licensed products because they feel like they are not building a custom solution from scratch &#8211; they are getting a tried and proven set of components requiring minimal customization.  But essentially all enterprise solutions are customized.  Business requirements change and software needs to change along with it.  This is a fact of life.  You need to make services profitable and successful so you can properly support your customers through the entire lifecycle of the product.  IBM is one of the most stable companies around and relies mostly on services revenue and customer satisfaction.  They will make your solution successful and they will make you pay for it.  They don&#8217;t get too bogged down on license revenue or even selling and using their own products.  They adhere to industry standards and are constantly on the lookout for a better way to serve their customers.</p>
<p>* <strong>Require adherence to industry standards and open programming models</strong>.  Some sellers will pitch their framework as &#8220;the secret sauce&#8221; which eliminates the need for developers.  But cost and access to good professional programmers, designers, analysts, and admins who can work with this solution ultimately determines whether a customer will be happy with a solution long term.  The buyers often don&#8217;t know they need standards and can&#8217;t tell an open programming model from a closed proprietary one.  They don&#8217;t want to be told there will be maintenance costs or enhancements needed so this can&#8217;t be part of your pitch but if it is not part of your strategy long term you will fail.  These days enterprise software companies and products come and go so if your solution is not standards based, you might need to rebuild it from scratch if a vendor stops supporting it.</p>
<p>* <strong>Beware the almighty direct sales person</strong>.  Most people watching &#8220;All in the Family&#8221; think that Meathead was usually right but that Archie usually won the argument.  This trend occurs in companies too &#8211; they are often unduly influenced by the polished sales person.  They will make impassioned pleas for high cost products and if they don&#8217;t get the exact right commission plan they can let their own goals outweigh the goals of the company in how they use their influence.  A good manager recognizes this and structures a sales person&#8217;s commission so they get a percentage of services and support revenue from their customers.  They share commissions with a team of inside sales folks who can worry about the small fish.  By working in teams, the inside sales person can improve the quality of the leads for the sales person.  Support and services is difficult to monetize with direct sales as you need to make it easy to do business with your company and direct sales only cares about the biggest fish in the water at any given time.  Without shared commissions, direct sales might spin inside sales as a waste of time as they take some low-hanging fruit away.</p>
<p>* <strong>The market should dictate license cost</strong>.  Horizontal software typically is inexpensive and vertical, more specialized software gets more expensive.  Sellers would love to sell all products for $20K/CPU or more but that might not be the right price target for your product to be competitive.  You need to survey the market, figure out who your customers are and what they are willing to pay, then maximize the revenue by choosing the right price.  Direct sales does need a high average deal size to be worthwhile but inside sales can profitably sell much lower priced products.</p>
<p>* <strong>Give developers a voice</strong>.  Enterprise solutions are all about customized software which means developers are going to get involved at some point.  Of course in the pitch, the seller will try to minimize this cost as customers want simplicity.  Customers want to think of themselves as buying off-the-shelf, push-button software.  But buyer beware.  Quite often, there is still programming involved in using these systems &#8211; it just takes a more interactive form.  That might be nice but since this is essentially reinventing how people program, it takes on quite a bit of complexity.  Software must be version controlled, deployable, support collaboration, possibly on branches, use maintainable database schemas, etc.  A shrink wrapped push button customizable software tool quite likely ignores all of these aspects.  It locks the typical developer out which just means you need a different type of developer and you have to reimplement all of these processes that took us decades as an industry to refine by yourself using adhoc means.</p>
<p>* <strong>Keep a balance of power between product management and engineering</strong>.  Product management needs to have control over the feature set as they represent the customer but there needs to be checks and balances because at the end of the day engineering needs responsibility to ensure designs work efficiently in practice.  I&#8217;ve seen product managers who were quite confident they did not need engineerings input for specifications, but then made such basic snafus in their thinking regarding security, scalability, maintainability etc. it was almost mind boggling &#8211; &#8220;Of course it&#8217;ll be secure &#8211; we&#8217;ll use SSL&#8221;.  If you have a rigid top-down management structure which prevents free-flow of information exchange and makes escalations so difficult as to be painful, you&#8217;ll get a bunch of developers who just are coding till 5 and don&#8217;t take responsibility for the customer&#8217;s success.</p>
<p>* <strong>Beware the &#8220;enterprise solution iceberg&#8221;</strong>.  One of the challenges in selling enterprise software is that the markets tend to be fairly small and fragmented.  For some companies, it is tempting to expand the markets by combining a large number of various software components into a single package to increase the size of the addressable market.  But to do this in a scalable way requires skilled engineering of packages, modules and dependencies.  Well supported in many industry standard software environments but easy to mess up if roll your own framework.   The result will be extremely long startup times and a very high memory footprint.  Software engineers smell this type of system instantly and run but your average enterprise buyer does not look closely under the hood before they buy.   They might argue that memory is cheap and some systems rarely need to be restarted so who cares if it takes 15 minutes?  For developers, that 15 minutes means a trip to get coffee and they might need to do that 20 or 30 times a day.  I try to keep my round-trip times to less than 20 or 30 secs max so I&#8217;m most productive.  If your system ever needs to scale, an app that could be run on a $15/month 128mb slice of a linux server now needs a quad core dedicated system with 2G maybe $150/month.  Just to store 1G of code of which you are using only a few %.  Finally, because of the large number of lines of code you have you are exposed to security threats, required upgrades etc.  And because of the massive footprint, you&#8217;ll suffer long downtimes and late nights by IT when they have to perform them all contributing to the pain and cost of system maintenance.</p>
<p>Ultimately, to sell enterprise software effectively you have to realize why the customers are paying so much for their solution.  They believe that more money they pay means more assurance of the success of the project.  Whether you call it license or service is almost irrelevant to them as long as the purchase succeeds in the long term.  As we developers know, for a project to succeed you need to follow best practices in the industry, support industry standards, and provide services and support for your customers as needed.  These can&#8217;t be afterthoughts if you want to win in the long term with any piece of software.  And buyers remember, you are buying a very intricate machine that needs to be ultra efficient and reliable not a slide deck.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffvroom.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffvroom.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffvroom.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jvroom.com&amp;blog=7336970&amp;post=39&amp;subd=jeffvroom&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jvroom.com/2009/10/29/tips-for-buying-and-selling-enterprise-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jeffvroom</media:title>
		</media:content>
	</item>
	</channel>
</rss>
