<?xml version="1.0"?>
<abiword version="unnumbered">
<!-- =====================================================================  -->
<!-- This file is an AbiWord document.                                      -->
<!-- AbiWord is a free, Open Source word processor.                         -->
<!-- You may obtain more information about AbiWord at www.abisource.com     -->
<!-- You should not edit this file by hand.                                 -->
<!-- =====================================================================  -->

<!--         Build_ID          = (none) -->
<!--         Build_Version     = unnumbered -->
<!--         Build_Options     = LicensedTrademarks:Off Debug:Off -->
<!--         Build_Target      = /work/abi/src/WIN32_4.0_i386_OBJ/obj -->
<!--         Build_CompileTime = 23:51:22 -->
<!--         Build_CompileDate = Feb  3 2000 -->

<styles>
<s name="Code" type="c" props="font-family:Courier New"/>
<s name="Heading 1" props="color:008080; font-size:36pt; margin-left:-0.2500in; margin-right:-0.2500in"/>
<s name="Heading 2" props="margin-left:0.7500in; margin-top:12pt; text-indent:-0.5000in"/>
<s name="Heading 3" props="margin-left:0.7500in; margin-top:12pt; text-indent:-0.1875in"/>
<s name="Normal" props="font-size:24pt"/>
</styles>
<section>
<p style="Heading 1" props="text-align:center">A <c props="font-style:italic">Practical</c> Approach to Cross-Platform Development</p>
<p style="Heading 1" props="text-align:center"><c props="text-decoration:overline">                                              </c></p>
<p style="Heading 1" props="text-align:center"><c props="color:000000; text-decoration:line-through">Eric Sink</c></p>
<p style="Heading 1" props="text-align:center"><c props="color:000000; text-decoration:none">Paul Rohr</c></p>
<p style="Heading 1" props="text-align:center"><c props="color:000000; font-size:24pt">Software Craftsman,  </c></p>
<p style="Heading 1" props="text-align:center"><c props="color:000000; font-size:24pt">AbiSource, Inc.</c></p>
<p style="Heading 1" props="text-align:center"></p>
<p style="Heading 1" props="text-align:center"><c props="color:000000; font-size:24pt; font-style:italic; font-weight:normal">Linux World, 2/4/2000</c></p>
<p></p>
<p style="Heading 1"><pbr/>people ask:  what is AbiWord?</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">The world's <c props="font-style:italic">only </c>...</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">	... Open Source,</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">	... cross-platform,</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">	... word processor!</p>
<p></p>
<p style="Heading 1">two reactions</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">&#xb7;	Cool!</p>
<p style="Heading 2" props="margin-left:0.5000in; text-indent:-0.2500in">&#xb7;	Are you <c props="font-style:italic">insane</c>?</p>
<p></p>
<p style="Heading 1"><pbr/>Open Source?  Are you insane?</p>
<p></p>
<p style="Heading 2">whoops, wrong conference  :-)</p>
<p></p>
<p style="Heading 1"><pbr/>Cross-platform?  Are you insane?</p>
<p style="Heading 2">No, we're not.</p>
<p style="Heading 2">But many people think we are...</p>
<p style="Heading 2"></p>
<p style="Heading 2">"Portability is for canoes."</p>
<p props="margin-left:1.0000in; margin-top:12pt">Jim McCarthy</p>
<p props="line-height:1.000000; margin-bottom:0.0000in; margin-left:1.0000in; margin-right:0.0000in; margin-top:0pt; text-align:left; text-indent:0.0000in">Director, Program Management<br/>Microsoft Visual C++ </p>
<p props="line-height:1.000000; margin-bottom:0.0000in; margin-left:1.0000in; margin-right:0.0000in; margin-top:12pt; text-align:left; text-indent:0.0000in"><c props="color:000000; font-family:Times New Roman; font-size:24pt; font-style:italic; font-weight:normal; text-decoration:none; text-position:normal">Dynamics of Software Development</c></p>
<p props="margin-left:1.0000in; margin-top:12pt"></p>
<p></p>
<p style="Heading 1"><pbr/>at one level, he's right...</p>
<p style="Normal"></p>
<p style="Heading 2">	The design and implementation of cross-platform (XP) software is <c props="font-style:italic">hard</c>. </p>
<p style="Heading 1"><pbr/>but people do it anyway...</p>
<p style="Heading 2">Some people just port.  </p>
<p style="Heading 3">&#xb7;	Ick. </p>
<p style="Heading 3" props="margin-top:0pt">	</p>
<p style="Heading 2">Others use a complete <c props="font-style:italic">abstraction layer</c>. </p>
<p style="Heading 3">&#xb7;	Commonly, designers attempt to provide a complete API layer which <c props="font-style:italic">totally insulates</c> the program's algorithms from non-portable code. </p>
<p style="Heading 1"><pbr/>we take another approach...</p>
<p style="Heading 2">In the AbiWord project, we: </p>
<p style="Heading 3">&#xb7;	embrace the fact that platform-specific code is a <c props="font-style:italic">necessity</c>, and </p>
<p style="Heading 3">&#xb7;	adopt an architecture which helps us <c props="font-style:italic">deal</c> with it, </p>
<p style="Heading 3">&#xb7;	rather than an architecture which helps us <c props="font-style:italic">avoid </c>it.  </p>
<p style="Heading 1"><pbr/>quick jargon review</p>
<p style="Heading 2">three familiar terms</p>
<p style="Heading 3" props="margin-left:1.5000in; text-indent:-0.9375in">GUI	graphical user interface (pixels++)</p>
<p style="Heading 3" props="margin-left:1.5000in; margin-top:0pt; text-indent:-0.9375in">QA	quality assurance</p>
<p style="Heading 3" props="margin-left:1.5000in; margin-top:0pt; text-indent:-0.9375in">CM	configuration management (builds)</p>
<p style="Heading 2" props="margin-left:1.1250in; margin-top:24pt; text-indent:-0.8750in">three less familiar ones</p>
<p style="Heading 3" props="margin-left:1.5000in; text-indent:-0.9375in">XP	cross-platform</p>
<p style="Heading 3" props="margin-left:1.5000in; margin-top:0pt; text-indent:-0.9375in">XAP	cross-application</p>
<p style="Heading 3" props="margin-left:1.5000in; margin-top:0pt; text-indent:-0.9375in">AP	app-specific policy</p>
<p style="Heading 1"><pbr/>3 approaches for XP GUI software</p>
<p style="Heading 2">1.	<c props="text-decoration:underline">platform ignorance</c></p>
<p style="Heading 3">&#xb7;	complete platform insulation layer<br/>(wxWindows, XVT, Java)</p>
<p style="Heading 2">2.	<c props="text-decoration:underline">platform experts</c></p>
<p style="Heading 3">&#xb7;	separate teams which loosely share code<br/>(Internet Explorer, Spyglass Mosaic)</p>
<p style="Heading 2">3.	<c props="text-decoration:underline">practical hybrid</c> </p>
<p style="Heading 3">&#xb7;	mix of shared and platform code with well-defined APIs in between<br/>(AbiWord, Mozilla)</p>
<p></p>
<p style="Heading 1"><pbr/>approach #1: platform ignorance</p>
<p style="Normal"></p>
<p style="Normal" props="text-align:center"> <image dataid="C:\ignorance.png_0" props="height:3.89in; width:5.40in"/> </p>
<p style="Heading 1"><pbr/>approach #1: platform ignorance</p>
<p style="Heading 2">PROS: </p>
<p style="Heading 3">&#xb7;	write &amp; maintain less code<br/>(faster development cycle)</p>
<p style="Heading 3" props="margin-top:12pt">&#xb7;	CM can usually be done once</p>
<p style="Heading 3" props="margin-top:12pt"></p>
<p style="Heading 2">FAQ:</p>
<p style="Heading 3">&#xb7;	why not use wxWindows ??</p>
<p style="Heading 1"><pbr/>approach #1: platform ignorance</p>
<p style="Heading 2">CONS: </p>
<p style="Heading 3">&#xb7;	performance, bloat</p>
<p style="Heading 3">&#xb7;	lowest-common-denominator</p>
<p style="Heading 3">&#xb7;	app usually ends up with non-native feel</p>
<p style="Heading 3">&#xb7;	QA needs to be done N times.  really!</p>
<p style="Heading 3">&#xb7;	false sense of speed (tough problems get shifted to the end of the project cycle)</p>
<p style="Heading 3">&#xb7;	bugs in the layer are <c props="font-style:italic">big </c>slow-downs</p>
<p style="Heading 3">&#xb7;	platform GUI knowledge is no help </p>
<p></p>
<p style="Heading 1"><pbr/>approach #2: platform experts</p>
<p style="Normal"></p>
<p style="Normal" props="text-align:center"> <image dataid="C:\experts.png_0" props="height:2.52in; width:5.28in"/> </p>
<p style="Normal" props="text-align:center"></p>
<p style="Heading 1"><pbr/>approach #2: platform experts</p>
<p style="Heading 2">PROS: </p>
<p style="Heading 3">&#xb7;	fast development cycle<br/>(teams don't wait on each other)</p>
<p style="Heading 3">&#xb7;	everything is native <br/>(good performance, size, etc)</p>
<p style="Heading 3">&#xb7;	each version takes full advantage of each platform's capabilities</p>
<p></p>
<p style="Heading 1"><pbr/>approach #2: platform experts</p>
<p style="Heading 2">CONS: </p>
<p style="Heading 3">&#xb7;	development progress is uneven</p>
<p style="Heading 3">&#xb7;	different app behavior on each platform</p>
<p style="Heading 3">&#xb7;	bugs often must get fixed N times</p>
<p style="Heading 3">&#xb7;	CM and build issues need to get done N times</p>
<p style="Heading 3">&#xb7;	doesn't scale</p>
<p style="Heading 3"></p>
<p style="Heading 1"><pbr/>approach #3: practical hybrid</p>
<p style="Heading 2">GOAL:</p>
<p style="Heading 3">&#xb7;	best of both worlds</p>
<p style="Heading 3">&#xb7;	ultralight framework provides direct access to native GUI services</p>
<p style="Heading 3">&#xb7;	the rest of the time we stay in XP code</p>
<p style="Heading 2">THE TRICK:</p>
<p style="Heading 3">&#xb7;	solve a few key problems, then stop</p>
<p style="Heading 3">&#xb7;	abstraction is a means, not an end</p>
<p style="Heading 3"></p>
<p style="Heading 1"><pbr/>approach #3: practical hybrid</p>
<p style="Heading 2">PROS: </p>
<p style="Heading 3">&#xb7;	all native <br/>(good performance, no unusual bloat)</p>
<p style="Heading 3">&#xb7;	app <c props="font-style:italic">feels</c> native and high quality</p>
<p style="Heading 3">&#xb7;	maximum use of shared code minimizes duplicated effort</p>
<p style="Heading 3"></p>
<p style="Heading 1"><pbr/>approach #3: practical hybrid</p>
<p style="Heading 2">CONS: </p>
<p style="Heading 3"><c props="color:000000; font-family:Times New Roman; font-size:24pt; font-style:normal; font-weight:normal; text-decoration:none; text-position:normal">&#xb7;	setting up multi-platform CM is </c><c props="color:000000; font-family:Times New Roman; font-size:24pt; font-style:italic; font-weight:normal; text-decoration:none; text-position:normal">hard</c></p>
<p style="Heading 3">&#xb7;	people break the build</p>
<p style="Heading 3">&#xb7;	overall development progress is slower</p>
<p style="Heading 2">PRO: </p>
<p style="Heading 3">&#xb7;	overall development progress is never deceiving</p>
<p></p>
<p style="Heading 1"><pbr/>OK, so how does it work?</p>
<p style="Heading 2">GOAL: </p>
<p style="Heading 3">&#xb7;	&gt;90% of the code we write is XP</p>
<p style="Heading 2" props="margin-top:24pt">first, some building blocks</p>
<p style="Heading 3">&#xb7;	use existing libraries</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	tree structure</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	common build environment</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	the donut rule</p>
<p style="Heading 2" props="margin-top:24pt">then, the design</p>
<p style="Heading 1"><pbr/>head start: use existing libraries</p>
<p style="Heading 2">~350,000 lines of code to build AbiWord </p>
<p style="Heading 2">~45% of that is XP code we got "for free"</p>
<p style="Heading 3" props="margin-left:1.1875in; tabstops:5.0000in/R">expat	9,438</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">ispell	5,812</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">libiconv	46,002</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">libpng	20,211</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">wv	60,907</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">zlib	<c props="text-decoration:underline">13,799</c></p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; tabstops:5.0000in/R">	156,169</p>
<p style="Heading 2">coding standards (ANSI C) help a <c props="font-style:italic">lot</c><c props="font-style:normal"> here</c></p>
<p></p>
<p style="Heading 1"><pbr/>tree structure  </p>
<p style="Heading 2">some nodes of the tree are entirely XP</p>
<p style="Heading 3"><c props="font-family:Courier New">abi/src/text/fmt/xp</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/text/ptbl/xp</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/impexp/xp</c></p>
<p style="Heading 2">others are a mix of XP and platform code</p>
<p style="Heading 3"><c props="font-family:Courier New">abi/src/wp/ap/beos</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/ap/mac</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/ap/qnx</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/ap/win</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/ap/unix</c></p>
<p style="Heading 3" props="margin-top:0pt"><c props="font-family:Courier New">abi/src/wp/ap/xp</c></p>
<p></p>
<p style="Heading 1"><pbr/>common build environment</p>
<p style="Heading 2">IDEA:</p>
<p style="Heading 3">&#xb7;	parallel makefiles are evil</p>
<p style="Heading 2">SOLUTION:</p>
<p style="Heading 3">&#xb7;	diving make system (picks right platform)</p>
<p style="Heading 3">&#xb7;	use vanilla <c props="font-family:Courier New">gmake</c> + <c props="font-family:Courier New">bash</c> everywhere</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt">&#xb7;	runs on all Unix flavors, plus BeOS</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt">&#xb7;	via Cygwin, also runs on Win32</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt">&#xb7;	Mac??</p>
<p style="Heading 3">&#xb7;	FAQ:  what about <c props="font-family:Courier New">autoconf</c>?</p>
<p></p>
<p style="Heading 1"><pbr/>products that build, ship</p>
<p style="Heading 2">GOAL:</p>
<p style="Heading 3">&#xb7;	product <c props="font-style:italic">always</c> builds on <c props="font-style:italic">every </c>platform</p>
<p style="Heading 3">&#xb7;	developers can focus on adding features</p>
<p style="Heading 3">&#xb7;	QA always has a working build to test</p>
<p style="Heading 3">&#xb7;	problems show up earlier<br/>(and thus are more likely to get fixed)</p>
<p style="Heading 2">HOW?</p>
<p style="Heading 3">&#xb7;	tools can help (Tinderbox)</p>
<p></p>
<p style="Heading 1"><pbr/>the donut rule</p>
<p style="Heading 2">developers on all platforms share: </p>
<p style="Heading 3"><c props="color:000000; font-family:Times New Roman; font-size:24pt; font-style:normal; font-weight:normal; text-decoration:none; text-position:normal">&#xb7;	a ton of XP code</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	a single CVS repository</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	a single build system</p>
<p style="Heading 3">&#xb7;	so, impact of broken build is magnified</p>
<p style="Heading 2">SOLUTION:</p>
<p style="Heading 3">&#xb7;	stub any platforms you don't implement</p>
<p style="Heading 3">&#xb7;	social engineering ... the donut rule</p>
<p></p>
<p style="Heading 1"><pbr/>designing a practical hybrid</p>
<p style="Heading 2">CONSTRAINTS:</p>
<p style="Heading 3">&#xb7;	leverage developers' platform expertise (build a totally native application)</p>
<p style="Heading 3">&#xb7;	do so with as much XP code as possible</p>
<p style="Heading 3">&#xb7;	keep our sanity intact, more-or-less</p>
<p style="Heading 2" props="margin-top:30pt">KEY QUESTION:</p>
<p style="Heading 3">&#xb7;	where do we draw the API boundaries?</p>
<p></p>
<p style="Heading 1"><pbr/>inside-out perspective</p>
<p style="Heading 2">GOAL:</p>
<p style="Heading 3">&#xb7;	spend as much time as possible in XP code</p>
<p style="Heading 2" props="margin-top:24pt">BUT:</p>
<p style="Heading 3">&#xb7;	need to get there first</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; text-indent:-0.1875in">&#xb7;	application launches in platform code</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; text-indent:-0.1875in">&#xb7;	GUI constantly sends platform events</p>
<p style="Heading 3" props="margin-left:1.1875in; margin-top:0pt; text-indent:-0.1875in">&#xb7;	all output triggers platform calls, too</p>
<p style="Heading 3">&#xb7;	we're surrounded!</p>
<p></p>
<p style="Heading 1"><pbr/>so, design it that way!</p>
<p></p>
<p> <image dataid="C:\inside.png_0" props="height:3.82in; width:6.08in"/> </p>
<p></p>
<p style="Heading 1"><pbr/>the framework mirrors the design</p>
<p style="Heading 2"><c props="font-family:Courier New">abi/src/af</c> has four components</p>
<p style="Heading 3">&#xb7;	Events (<c props="font-family:Courier New">af/ev</c>)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Graphics (<c props="font-family:Courier New">af/gr</c>)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Utilities (<c props="font-family:Courier New">af/util</c>)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Top-level framework (<c props="font-family:Courier New">af/xap</c>)</p>
<p style="Heading 3" props="margin-top:0pt"></p>
<p style="Heading 2">NOTE</p>
<p style="Heading 3">&#xb7;	each of these has XP and platform sides</p>
<p></p>
<p style="Heading 1"><pbr/>just a little C++</p>
<p style="Heading 2">HERESY !!</p>
<p style="Heading 3">&#xb7;	advanced C++ features aren't portable</p>
<p style="Heading 3">&#xb7;	Linus likes ANSI C, and so do we</p>
<p style="Heading 2">BUT...</p>
<p style="Heading 3">&#xb7;	... if you're <c props="font-style:italic">very</c> disciplined, it works</p>
<p style="Heading 3">&#xb7;	specify XP stuff as abstract C++ classes</p>
<p style="Heading 3">&#xb7;	concrete, platform-specific subclasses</p>
<p style="Heading 3">&#xb7;	also helps kill leaks (destructors)</p>
<p></p>
<p style="Heading 1"><pbr/>example #1:  <c props="font-family:Courier New">GR_Graphics</c></p>
<p style="Heading 2">fairly vanilla 2D graphics API</p>
<p style="Heading 3">&#xb7;	Select fonts and colors</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Draw text, line, polyline, etc.</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Draw images</p>
<p style="Heading 2">subclasses</p>
<p style="Heading 3">&#xb7;	<c props="font-family:Courier New">GR_BeOSGraphics</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">GR_Win32Graphics</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">GR_UnixGraphics</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">PS_Graphics</c></p>
<p style="Heading 2">printing is handled by appropriate subclass</p>
<p></p>
<p style="Heading 1"><pbr/>example #2:  events</p>
<p style="Heading 2">GOAL: zero app-specific platform code for:</p>
<p style="Heading 3">&#xb7;	<c props="font-family:Courier New">EV_Keyboard</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">EV_Menu</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">EV_Mouse</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-family:Courier New">EV_Toolbar</c></p>
<p style="Heading 3">&#xb7;	all events are table-driven from XP code</p>
<p style="Heading 2">BENEFITS:</p>
<p style="Heading 3">&#xb7;	flexible keybindings (default, emacs, vi)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	easy localizations (including icons)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	zero work to keep platform UIs consistent</p>
<p></p>
<p style="Heading 1"><pbr/>practicality test:  dialogs</p>
<p style="Heading 2">CONSTRAINTS:</p>
<p style="Heading 3">&#xb7;	look totally native<br/>(leverage common platform dialogs)</p>
<p style="Heading 3">&#xb7;	minimize the amount of platform code</p>
<p style="Heading 2" props="margin-top:24pt">BE PRACTICAL:</p>
<p style="Heading 3">&#xb7;	currently <c props="font-style:italic">not</c><c props="font-style:normal"> in the framework</c></p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-style:normal">move each dialog's </c><c props="font-style:italic">behavior </c><c props="font-style:normal">to XP code </c></p>
<p style="Heading 3">&#xb7;	PRO:  consistent look and feel</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	CON:  dialogs take longer to develop</p>
<p></p>
<p style="Heading 1"><pbr/>comparing the approaches</p>
<p style="Heading 2">single platform is the baseline</p>
<p style="Heading 3">&#xb7;	a lot simpler to develop</p>
<p style="Heading 3">&#xb7;	a lot faster to develop</p>
<p style="Heading 3"></p>
<p style="Heading 2"><c props="font-style:italic">all</c> XP approaches are slower than </p>
<p style="Heading 2" props="margin-top:0pt"><c props="font-style:italic">any</c> single platform approach</p>
<p></p>
<p style="Heading 1"><pbr/>comparing the approaches, cont.</p>
<p style="Heading 2">our approach </p>
<p style="Heading 3">&#xb7;	seems slower than other XP approaches</p>
<p style="Heading 2" props="margin-top:24pt">the results</p>
<p style="Heading 3">&#xb7;	a <c props="font-style:italic">much</c> more accurate perception of the actual speed of the project</p>
<p style="Heading 3">&#xb7;	a very high quality piece of software</p>
<p style="Heading 2" props="margin-top:24pt">the $64,000 question</p>
<p style="Heading 3">&#xb7;	is the additional time investment worth it?</p>
<p></p>
<p style="Heading 1"><pbr/>adding up the scorecard</p>
<p style="Heading 2">How practical has our approach been?</p>
<p style="Heading 3">&#xb7;	quality of the product</p>
<p style="Heading 3">&#xb7;	platforms supported</p>
<p style="Heading 3">&#xb7;	executable size</p>
<p style="Heading 3">&#xb7;	% XP code</p>
<p style="Heading 3">&#xb7;	developer support</p>
<p></p>
<p style="Heading 1"><pbr/>scorecard:  quality of the product</p>
<p></p>
<p props="text-align:center"><c props="font-style:italic"> [big image cut to save space] </c></p>
<p style="Heading 1"><pbr/>scorecard:  platforms supported</p>
<p style="Heading 2">we ship binaries for</p>
<p style="Heading 3">&#xb7;	Windows (95, 98, NT)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Linux (Intel, PowerPC, Alpha) </p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	BeOS (Intel, PPC) </p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	FreeBSD (Intel)</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	Solaris (Sparc)</p>
<p style="Heading 2">in the works</p>
<p style="Heading 3">&#xb7;	QNX/Photon</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	MacOS (just started)</p>
<p></p>
<p style="Heading 1"><pbr/>scorecard:  executable size</p>
<p style="Heading 2">the usual suspects:</p>
<p style="Heading 3" props="tabstops:4.0000in/L,0.7500in/L"><c props="font-style:italic">&#xb7;	Star Office</c> (Sun)	60 MB</p>
<p style="Heading 3" props="margin-top:0pt; tabstops:4.0000in/L,0.7500in/L">&#xb7;	<c props="font-style:italic">WordPerfect</c> (Corel)	bigger	</p>
<p style="Heading 3" props="margin-top:0pt; tabstops:4.0000in/L,0.7500in/L">&#xb7;	<c props="font-style:italic">Word</c> (Microsoft)	even bigger</p>
<p style="Heading 2" props="margin-top:24pt">Open Source alternatives:</p>
<p style="Heading 3" props="tabstops:4.0000in/L,0.7500in/L">&#xb7;	<c props="font-style:italic">KWord </c>	??</p>
<p style="Heading 3" props="margin-top:0pt; tabstops:4.0000in/L,0.7500in/L">&#xb7;	<c props="font-style:italic">AbiWord </c>	~ 1 floppy disk</p>
<p style="Heading 2" props="margin-top:24pt">Q:	how big is "Hello World" in <c props="font-style:italic">your </c>favorite framework?</p>
<p></p>
<p style="Heading 1"><pbr/>scorecard:  % XP (framework)</p>
<p></p>
<p>Overall, to get the framework running on a single platform, it takes about 26,000 lines of code (<c props="font-family:Courier New">.cpp</c>, <c props="font-family:Courier New">.c</c>, <c props="font-family:Courier New">.h</c>).</p>
<p></p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R">	<c props="text-decoration:underline">XP	GUI</c>	</p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R"><c props="font-family:Courier New">af/ev/</c>	3,506	2,809	56%</p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R"><c props="font-family:Courier New">af/gr/</c>	659	1,470	31%</p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R"><c props="font-family:Courier New">af/util/</c>	4,839	560	90%</p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R"><c props="font-family:Courier New">af/xap/</c><c props="text-decoration:underline">	7,680	4,433	63%</c></p>
<p props="tabstops:5.7500in/R,3.5625in/R,4.7500in/R">	16,684	9,272	64%</p>
<p></p>
<p style="Heading 1"><pbr/>scorecard:  % XP (application)</p>
<p></p>
<p>Here's where our approach really shines:</p>
<p></p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R">	<c props="text-decoration:underline">XP	GUI</c></p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"><c props="font-family:Courier New">text/fmt/</c>	20,807	0	100%</p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"><c props="font-family:Courier New">text/ptbl/</c>	11,156	0	100%</p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"><c props="font-family:Courier New">wp/ap/</c>	23,594	6,594	78%</p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"><c props="font-family:Courier New">wp/impexp/</c>	10,821	0	100%</p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"><c props="font-family:Courier New">wp/main/</c><c props="text-decoration:underline">	44	27	62%</c></p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R">	66,422	6,621	91%</p>
<p props="tabstops:5.6875in/R,3.5000in/R,4.7500in/R"></p>
<p></p>
<p style="Heading 1"><pbr/>scorecard:  developer support</p>
<p style="Heading 2">very healthy Open Source project</p>
<p style="Heading 3">&#xb7;	~70 names in CREDITS.TXT</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	many first-timers</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	we wrote <c props="font-style:italic">zero</c> BeOS or QNX code </p>
<p style="Heading 2" props="margin-top:24pt">go where the "GUI hackers" are</p>
<p style="Heading 3">&#xb7;	pixel-twiddling is its own art form</p>
<p style="Heading 3" props="margin-top:0pt">&#xb7;	<c props="font-style:italic">leverage</c>:  platform experts write XP code</p>
<p style="Heading 2" props="margin-top:24pt">over a dozen localizations</p>
<p style="Heading 3">&#xb7;	including Indonesian and Catalan</p>
<p style="Heading 1"><pbr/>questions?</p>
<p style="Heading 2"></p>
</section>
<data>
<d name="C:\experts.png_0">
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
fTVdEAAAAABJRU5ErkJggg==
</d>
<d name="C:\ignorance.png_0">
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
IPwXv2dgb59PAAkAAAAASUVORK5CYII=
</d>
<d name="C:\inside.png_0">
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
KP8LiNby42DT5ecAAAAASUVORK5CYII=
</d>
</data>
</abiword>

