Difference between revisions of "Philosophy : The way Martin Vahi sees his own Mindset : Craftsmaship Aspirations of the Martin Vahi"

From bitrary
Jump to: navigation, search
 
m
 
(34 intermediate revisions by the same user not shown)
Line 1: Line 1:
  
 
[[Philosophy]] : [[Philosophy : The way Martin Vahi sees his own Mindset|The way Martin Vahi sees his own Mindset]]
 
[[Philosophy]] : [[Philosophy : The way Martin Vahi sees his own Mindset|The way Martin Vahi sees his own Mindset]]
 +
 +
 +
The text of this chapter will change over time. For example, once upon a time I(Martin Vahi) thought that my clients should be as autonomous as possible, but as of 2020_03 I think that only those clients, who want to get by without me, should have that opportunity without any extra fee, but the ones, who are too lazy to download all of the deliverables that they paid for, should be allowed to take their risks of not getting them. As of 2020_03 my policy is that I archive all deliverables and make them available to my former clients without extra fee, but ONLY, IF THEY ASK FOR THEM. If they do not download and do not even ask later, then that's their own risk and they do know that I am not immortal, I may end up at a plane crash, car accident, get hit by a train, etc.
 +
 +
 +
 +
= 2020_03 Version =
 +
 +
 +
== Speed, Memory Consumption, Data Traffic Optimization ==
 +
 +
At least some elemental speed-optimization must be done at the very start, during algorithm/architecture design phase, because it can't be done later without getting into all of the very details that one thought at during the design phase. '''The industry standard scheme to slam something together and start "profiling" later is not my way.''' Asymptotic complexity is more important than complexity at small datasets and it is OK to have just
 +
 +
    func_run_the_asymptotically_fast_version()
 +
 +
in stead of
 +
 +
    if (small_dataset){func_run_the_algorithm_that_is_fast_with_small_datasets()}
 +
    else{func_run_the_asymptotically_fast_version()}
 +
 +
unless the
 +
 +
    func_run_the_algorithm_that_is_fast_with_small_datasets()
 +
 +
is readily available or the datasets tend to be often times "small".
 +
 +
 +
 +
== Tailoring for Hardware ==
 +
 +
Some tasks just require a certain amount of computational power regardless of era and regardless of what kind of hardware is available. In those cases the available hardware itself sets a limit, what kind of applications are even possible, regardless of software speed optimizations. Unless the development work amount increases substantially or portability suffers, software components should be written so that they can be used on both, modern computers and old computers, even microcontrollers. The old computers or simulators of those computers can be used for testing that the speed optimizations succeeded with the datasets that those old computers are expected to be capable of handling. It is assumed that the hardware will change and the availability of a particular brand of C/C++ compiler is not guaranteed. The lowest level that is considered stable is the C/C++ programming language "sufficiently old" standard.
 +
 +
 +
As of 2020_03 I do not offer microcontroller firmware development to paying clients and I do NOT intend to offer that to paying clients in the future, but most of my microcontroller software is written in assembly that is NOT hand-written, but generated by my own assembler-generator. The reason for that is that it is not known, how a particular compiler uses MCU registers.
 +
 +
 +
 +
== Backports and Upgrades ==
 +
 +
Each project has a development virtual appliance, for example, a VirtualBox appliance, where all of the build tools and tests have been installed. That allows old projects to be re-built on new hardware and operating system combinations even, if the newer operating system and hardware combinations do not support some of the build tools any more. Documentation is NOT part of that appliance or there will be a very minimal set of documentation. To guarantee that old document formats can be read with original software that renders the old documentation correctly, there will be special documentation reading virtual appliances that do not have to include the documentation themselves. The use of virtual appliances allows to use GUI based development tools so that the GUI based tool is usable even if some GUI related components of the tools are not available on the newer hardware and operating system combination. For example, the Oracle promised to delete the Java Swing GUI library from the Java stdlib. Data exchange between the virtual appliance and the rest of the development environment may be implemented by using sshfs or FTP or even custom software, if none of the 2 are usable.
 +
 +
 +
 +
== Art Versus Practicality ==
 +
 +
'''Practicality is superior to artistic beauty.''' Practicality is often times in conflict with artistic beauty and in those cases the practicality prevails. For example, from the point of view of reduction of human mistakes and from the point of view of speeding up human work it helps, if the screen contains only those graphical elements that a human needs for making a choice. That is in conflict with artistic beauty, because beautiful artistic images distract the human and do not serve the purpose of making the application as quickly usable as possible. '''In the case of my applications there is an effort to keep the screen as empty as possible at all times and to take advantage of the whole physical screen area.''' In the case of my applications there is an effort to assign usually suitable default values to all settings, so that the settings need to be changed rarely, only, when the "reasonable defaults" do not suit.
 +
 +
 +
 +
== My Technology Stack ==
 +
 +
* '''Ruby''' for build system, tests, my own command-line development tools.
 +
* '''C/C++''' for anything truly speed-optimized.
 +
* '''ParaSail''' for non-speed-critical fast applications software.
 +
* '''PHP''' for interfacing with web servers. PHP can execute a command-line application that actually implements the server side of the web application and the PHP can return to the server what the command-line application returned to console.
 +
* '''JavaScript''' with AJAX for GUI development. The widgets are generated purely in JavaScript at the web browser.
 +
* '''Linux and Bash''' as the development operating system.
 +
* '''Linux and FreeBSD''' as the deployment operating system(s) for web applications.
 +
* '''Fossil''' for project documentation and bugtrack.
 +
* '''Vim''' as the main code editor
 +
* '''NetBeans and Eclipse''' and some closed source IDE-s with Vim keybindings for structured text editing. In the past I also used the KomodoEdit.
 +
* '''VirtualBox''' for creating and running virtual appliances.
 +
* '''git''' for revision control.
 +
* '''sshfs''' for connecting cluster nodes and web hosting accounts.
 +
* '''Astyle and IDE built-in formatters and Paul Lutus rbeautify.rb''' for code formatting.
 +
* '''SQLite and PostgreSQL and RethinkDB''' for various relational database applications.
 +
* '''graphviz/dot''' for static graph image creation.
 +
* '''Various Linux console tools''' for various tasks. Some of them are: hashdeep, sha256sum, sha512sum, grep, find, xargs, (g)awk, GNU make, cmake, cat.
 +
* '''Web Browsers and GhostScript-reader(s) and PDF-reader(s)''' for GUI development and documentation reading. [http://www.seamonkey-project.org/ SeaMonkey] composer and [https://www.w3.org/Amaya/ Amaya] for documentation writing.
 +
* '''LibreOffice''' for some documents.
 +
* '''Gimp, xview(er), InkScape''' for graphics development.
 +
* '''ffmpeg''' for video conversion.
 +
* '''[https://obsproject.com OBS Studio]''' for screenrecording on '''Windows'''.
 +
* '''[https://shotcut.org/ Shotcut]''' for video editing on '''Windows'''.
 +
* '''[https://docs.microsoft.com/en-us/windows/wsl/ Windows Subsystem for Linux]'''(WSL) for running Ruby applications on Windows and for using Vim on Windows.
 +
* '''[https://kanotix.com/ Kanotix Linux] and NilFS2 and ReiserFS''' for building a Linux cluster from old laptops and USB-HDD-s.
 +
* '''FreeBSD''' for creating a file exchange server.
 +
* '''openSUSE Linux''' for running main development machine(s).
 +
* '''[https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html LTspice]''' for analog circuit simulation.
 +
* '''[https://www.kicad-pcb.org/ KiCad]''' for drawing schematics.
 +
* '''REDUCE, Octave, SciLab, Maxima''' for math.
 +
* '''Doxygen and Javadoc and RDoc''' for API documentation.
 +
* '''FreePascal/Lazarus''' for network and simplistic GUIs on Windows.
 +
* '''Racket''' for complex text processing, translation.
 +
* '''Drakon and Umbrello''' for technical notes.
 +
* '''rsync and Unison and BitTorrent''' for large file transfers.
 +
 +
The rest of the programming languages are in the role of interface languages.
 +
 +
 +
 +
== No Artificial Lock-in ==
 +
 +
'''Source code will consist of parts that are client project specific and parts that are general. The general parts are all open source components that have a license that allows the components to be used in closed source projects. The copyrights of some of the general parts are owned by me(Martin Vahi).''' The copyrights of the client project specific parts will be owned by the paying client, but the catch is that those components that are not specific to the client business, for example, general mathematics routines, general data structures, probably take the majority of the development time and those will be placed to the open source libraries that are owned by me, Martin Vahi, so that all clients and even people, who are not my clients, can benefit from the general infrastructure related software development work that is not client project specific. I find it to be a fair deal, because each client benefits from the clients that bough my services before them and they would not be able to get the kind of service that they do, if I did not use the general infrastructure components from my previous projects.
 +
 +
 +
I intentionally try to avoid taking clients that business wise compete with each other, because I have to help my client to become as competitive as possible and I can not do my consultancy work properly if I have clients that compete with each other, unless both of them agree that I transfer the information of one of them to another and vice versa. If at some point in time some of my former clients creates a business project that competes with some of my other former client's projects, then my policy is to be open about that towards both of my former clients, with full disclosure about the identities of the clients, so that they can take an informed decision to refuse my services or to continue using my services with the full acceptance that any knowledge that is useful to their project will be passed on to them by me regardless of where I have received that information, including the information received while working on their competitor's project, and vice versa, their competitors will receive all useful information, except client listings, from their project and '''all of that with the full knowledge of all of the related parties that I do that.'''

Latest revision as of 00:25, 22 March 2020

Philosophy : The way Martin Vahi sees his own Mindset


The text of this chapter will change over time. For example, once upon a time I(Martin Vahi) thought that my clients should be as autonomous as possible, but as of 2020_03 I think that only those clients, who want to get by without me, should have that opportunity without any extra fee, but the ones, who are too lazy to download all of the deliverables that they paid for, should be allowed to take their risks of not getting them. As of 2020_03 my policy is that I archive all deliverables and make them available to my former clients without extra fee, but ONLY, IF THEY ASK FOR THEM. If they do not download and do not even ask later, then that's their own risk and they do know that I am not immortal, I may end up at a plane crash, car accident, get hit by a train, etc.


2020_03 Version

Speed, Memory Consumption, Data Traffic Optimization

At least some elemental speed-optimization must be done at the very start, during algorithm/architecture design phase, because it can't be done later without getting into all of the very details that one thought at during the design phase. The industry standard scheme to slam something together and start "profiling" later is not my way. Asymptotic complexity is more important than complexity at small datasets and it is OK to have just

   func_run_the_asymptotically_fast_version()

in stead of

   if (small_dataset){func_run_the_algorithm_that_is_fast_with_small_datasets()}
   else{func_run_the_asymptotically_fast_version()}

unless the

   func_run_the_algorithm_that_is_fast_with_small_datasets()

is readily available or the datasets tend to be often times "small".


Tailoring for Hardware

Some tasks just require a certain amount of computational power regardless of era and regardless of what kind of hardware is available. In those cases the available hardware itself sets a limit, what kind of applications are even possible, regardless of software speed optimizations. Unless the development work amount increases substantially or portability suffers, software components should be written so that they can be used on both, modern computers and old computers, even microcontrollers. The old computers or simulators of those computers can be used for testing that the speed optimizations succeeded with the datasets that those old computers are expected to be capable of handling. It is assumed that the hardware will change and the availability of a particular brand of C/C++ compiler is not guaranteed. The lowest level that is considered stable is the C/C++ programming language "sufficiently old" standard.


As of 2020_03 I do not offer microcontroller firmware development to paying clients and I do NOT intend to offer that to paying clients in the future, but most of my microcontroller software is written in assembly that is NOT hand-written, but generated by my own assembler-generator. The reason for that is that it is not known, how a particular compiler uses MCU registers.


Backports and Upgrades

Each project has a development virtual appliance, for example, a VirtualBox appliance, where all of the build tools and tests have been installed. That allows old projects to be re-built on new hardware and operating system combinations even, if the newer operating system and hardware combinations do not support some of the build tools any more. Documentation is NOT part of that appliance or there will be a very minimal set of documentation. To guarantee that old document formats can be read with original software that renders the old documentation correctly, there will be special documentation reading virtual appliances that do not have to include the documentation themselves. The use of virtual appliances allows to use GUI based development tools so that the GUI based tool is usable even if some GUI related components of the tools are not available on the newer hardware and operating system combination. For example, the Oracle promised to delete the Java Swing GUI library from the Java stdlib. Data exchange between the virtual appliance and the rest of the development environment may be implemented by using sshfs or FTP or even custom software, if none of the 2 are usable.


Art Versus Practicality

Practicality is superior to artistic beauty. Practicality is often times in conflict with artistic beauty and in those cases the practicality prevails. For example, from the point of view of reduction of human mistakes and from the point of view of speeding up human work it helps, if the screen contains only those graphical elements that a human needs for making a choice. That is in conflict with artistic beauty, because beautiful artistic images distract the human and do not serve the purpose of making the application as quickly usable as possible. In the case of my applications there is an effort to keep the screen as empty as possible at all times and to take advantage of the whole physical screen area. In the case of my applications there is an effort to assign usually suitable default values to all settings, so that the settings need to be changed rarely, only, when the "reasonable defaults" do not suit.


My Technology Stack

  • Ruby for build system, tests, my own command-line development tools.
  • C/C++ for anything truly speed-optimized.
  • ParaSail for non-speed-critical fast applications software.
  • PHP for interfacing with web servers. PHP can execute a command-line application that actually implements the server side of the web application and the PHP can return to the server what the command-line application returned to console.
  • JavaScript with AJAX for GUI development. The widgets are generated purely in JavaScript at the web browser.
  • Linux and Bash as the development operating system.
  • Linux and FreeBSD as the deployment operating system(s) for web applications.
  • Fossil for project documentation and bugtrack.
  • Vim as the main code editor
  • NetBeans and Eclipse and some closed source IDE-s with Vim keybindings for structured text editing. In the past I also used the KomodoEdit.
  • VirtualBox for creating and running virtual appliances.
  • git for revision control.
  • sshfs for connecting cluster nodes and web hosting accounts.
  • Astyle and IDE built-in formatters and Paul Lutus rbeautify.rb for code formatting.
  • SQLite and PostgreSQL and RethinkDB for various relational database applications.
  • graphviz/dot for static graph image creation.
  • Various Linux console tools for various tasks. Some of them are: hashdeep, sha256sum, sha512sum, grep, find, xargs, (g)awk, GNU make, cmake, cat.
  • Web Browsers and GhostScript-reader(s) and PDF-reader(s) for GUI development and documentation reading. SeaMonkey composer and Amaya for documentation writing.
  • LibreOffice for some documents.
  • Gimp, xview(er), InkScape for graphics development.
  • ffmpeg for video conversion.
  • OBS Studio for screenrecording on Windows.
  • Shotcut for video editing on Windows.
  • Windows Subsystem for Linux(WSL) for running Ruby applications on Windows and for using Vim on Windows.
  • Kanotix Linux and NilFS2 and ReiserFS for building a Linux cluster from old laptops and USB-HDD-s.
  • FreeBSD for creating a file exchange server.
  • openSUSE Linux for running main development machine(s).
  • LTspice for analog circuit simulation.
  • KiCad for drawing schematics.
  • REDUCE, Octave, SciLab, Maxima for math.
  • Doxygen and Javadoc and RDoc for API documentation.
  • FreePascal/Lazarus for network and simplistic GUIs on Windows.
  • Racket for complex text processing, translation.
  • Drakon and Umbrello for technical notes.
  • rsync and Unison and BitTorrent for large file transfers.

The rest of the programming languages are in the role of interface languages.


No Artificial Lock-in

Source code will consist of parts that are client project specific and parts that are general. The general parts are all open source components that have a license that allows the components to be used in closed source projects. The copyrights of some of the general parts are owned by me(Martin Vahi). The copyrights of the client project specific parts will be owned by the paying client, but the catch is that those components that are not specific to the client business, for example, general mathematics routines, general data structures, probably take the majority of the development time and those will be placed to the open source libraries that are owned by me, Martin Vahi, so that all clients and even people, who are not my clients, can benefit from the general infrastructure related software development work that is not client project specific. I find it to be a fair deal, because each client benefits from the clients that bough my services before them and they would not be able to get the kind of service that they do, if I did not use the general infrastructure components from my previous projects.


I intentionally try to avoid taking clients that business wise compete with each other, because I have to help my client to become as competitive as possible and I can not do my consultancy work properly if I have clients that compete with each other, unless both of them agree that I transfer the information of one of them to another and vice versa. If at some point in time some of my former clients creates a business project that competes with some of my other former client's projects, then my policy is to be open about that towards both of my former clients, with full disclosure about the identities of the clients, so that they can take an informed decision to refuse my services or to continue using my services with the full acceptance that any knowledge that is useful to their project will be passed on to them by me regardless of where I have received that information, including the information received while working on their competitor's project, and vice versa, their competitors will receive all useful information, except client listings, from their project and all of that with the full knowledge of all of the related parties that I do that.