Tuesday, June 14, 2016

My book case - Non-IT

Ok, this post documents most of the remaining books on the book shelves.  The content mainly covers Christianity, Home/Repair, Metal working, Gardening, Mat and Science.

Here is a link to my previous post covering my IT related books.

I'm not going to document all the magazines and the remaining books - a combination of family "fun reads", cook books and other miscellany.


Here is my bible (I find the "New American Standard Bible" pretty easy to read) and a few other books we have.  One nice thing about God is that God doesn't need to change - one book tells it all. Oh, we do have other books because I like to understand historical context, etc at times as well.  For better or worse, I don't think I could ever consider myself a bible scholar though.  I find myself having to read a lot more IT technical books to keep up with the changing times.


Here are other Christianity related books on the other side of the bookcase. Most of these are my wife's.

I had a brief plan to do a bit of a career change from general IT into Bioinformatics but decided that the combination of a time consuming primary job along with the need to spend quality time with my family outweighed my desire for change.  On a different note, when studying material like this I find it hard *not to see* God's handiwork. 


For as many barn/shed books as I ended up with (cleaned out my fathers stash when they moved a while back... I couldn't say no), I should have built the workshop I planned.  Maybe after we get moved.. I found most of the deck books either had overly fancy projects or didn't really meet current construction codes - googling for stuff kept me code compliant but you still have to double check things.  The books on electricity and concrete work helped me out with a couple projects.




Here are a bunch of my "hobby" books.  I will say that I am hugely impressed with how much raw data is crammed into the "Machinery's Handbook" - it is purely a reference but helpful too in a sort of "find what you don't know" kind of way.  At some point, I would still love to build a CNC router and maybe work with some milling, cutting, plasma cutting type tools.


 Most of these math books are related to my math minor.  The more "business statistics" related books are my wife's.  On a rare occasion I pull one of these out because I want to remember how to solve some problem or another.  I had hoped my son might read these a little bit (he does like math) but these just don't have the draw of his fun reading or drawing activities.

 The physics are from my undergrad degree and the others are actually text books I got from my dad when they moved.  The old books are dated technology wise but still have some interesting things here and there.  It is kind of interesting to see the difference in writing styles between ~1960's text books and technical writing today.  The old text books are a bit dry in style but I have to wonder if the "easier reading style" nowadays isn't required because everyones attention span is so low. I did laugh at some article indicating that the average adult has around an 8 second attention span while a gold fish has a 9 second attention span.

Here is the last of the stuff I care to document. phew.  I do like gardening and hope I will still again have time to do some once I find an appropriate job and relocate as desired.

I hope you find something enjoyable out of all this.  Thanks for reading!
Scott

Proverbs 18:15
15 The heart of the discerning acquires knowledge, for the ears of the wise seek it out.

Sunday, June 12, 2016

My book case - IT related

Here is the start of some posts documenting my personal "library".  It will take some time to document them all.  I thought it would be interesting to post these - some of the books are probably not very common.  I have many aging tech books I've gathered over 20 years as well.  I'm doing this in preparation of an eventual family relocation for which I may have to part ways with some books.

Here is a link to my second post for my non-IT items.


I had plenty of interest in OS design back in college but those books don't get used now.  The more general UNIX/Linux related books and Korn Shell sometimes get pulled when there is a need but often it is easier just to Google for things.  I never did any Motif related development but I accepted those from my brother in-law since they seemed interesting at the time but I never took the time to do anything with them. There are a few times I've gone back to the Advanced Programming in UNIX book - usually when I was trying to figure out some problem in Open Source app I was trying to get working at home (some years ago). I think I went to it once for a work related issue I was researching once or twice. The mainframe related books are my wife's - I only briefly worked with a mainframe and only at an operations related job for a telecom early in my IT career.



I've always had an interest in language/compiler development.  One of my prior jobs did involve building parsers and scanners though which was enjoyable.  The PCCTS (Purdue Compiler Construction Tool Set) is the ancestor of ANTLR.  I always found the creator/author, Terrance Parr, very interesting - never met him but lurked on sites where information he (and a number of others) posted often helped me.  I've thought about buying the ANTLR 4 reference book but since I am not doing any compiler/parsing related work right now it seems like a bit of waste (and I have little extra time while trying to pick up more common new technology).


Some of these I bought when working on projects and wanted to reference or research. Others are from college or general interest (wife or me). I have gone through a number of "Oracle - The complete references" over the years but I think this Oracle 10g is my last.  Now it is just easier to Google for material and the "Tome" gets heavy carting around. I find some additional useful Oracle related content here at times.

No, the FORTRAN and COBOL books are not mine - they are my wife's.  She did tell me I could get rid of them. I do like to read up on languages but I rarely use most of them.  My copy of "The C++ Programming Language" was very heavily used in the past but is pretty dated now and I don't use C++ at the moment.  I did recently pick up the "Effective Modern C++" because I wanted to brush up on things - WOW is my best description of the amount and type of changes.  The relearning curve is a bit steep. I keep hoping to find a moment to use R in some practical way.  I have a few ideas that I would like to try out but no time and too hard of a sell to talk with management about. I picked up the .NET book because I've had to do a bit of coding related to MS FIM but it wasn't substantial.  I will finish the book at some point but other needs/books are more pressing.


I've had a long term interest in Assembly language but generally little time to use.  I was hoping to generate some interest with my kids (note the Raspberry Pi related items) but I think I am on my own there.  The TRS-80 Assembly language was the 2nd language I taught myself - after the built-in basic started to bore me. I picked up the Microprocessors Vol I & II a long time ago and found the content interesting but never did anything useful with the information. They might make good geeky "coffee table" books.  I did write a couple Scala programs/utilities a while back at work after reading the "Programming Scala" book but feel it would be a mistake to push it too much since we are understaffed and others don't have the time to pick it up at this point. I am planning on playing with it further outside work when time permits to toy with some Akka ideas.


My college degree included a good amount of electrical engineering/computer engineering courses so some of this is related to that. Some of it was interest in HPC for a period of time but I didn't have a job in that.  The Arduino/AVR related books are current hobby interests if/when I find time.


 A couple of these books go pretty far back - see if you can figure out which 2 are the oldest.  I didn't end up writing many graphics programs - I ended up doing some MFC related enhancements/bug fixes years ago though for work. 

I started with the "Algorithms" book by Sedgewick but wish I had gotten the "C" version instead of Pascal. Most of these are mine and those that my wife got during college I browsed out of interest anyways.

I do tend to get the study guides but never seem to find the time and motivation to take the tests. Anyways, they do contain good content and are still beneficial. I was a little concerned by the number of errata for the OCA study guide.  I wish the content had been better verified before publication. 

Most of these are what I acquired related to work.  A couple are books my wife picked up. I've done more of the back end development at my current job but debugged many JSP's and am now doing plenty of debugging and maint on a JSP/jQuery/Spring related application. 

Regarding JSF books; I did start a push for JSF2 as a standard but that stalled - not enough developers are experienced in it.  I've been hoping to leverage what I learned from my JSF 2.x related books but so far only some minor tools were viable candidates but it worked well.  For any non-mobile internal app, I would evaluate JSF2 as a viable option. For mobile apps, it seems a little less clear cut - there is extreme flexibility in more client side Javascript/CSS based technologies (jQuery, bootstrap, etc) regarding UI and mobile/responsiveness. I've not done any real mobile development but to do so in JSF probably means leveraging mobile friendly frameworks such Primefaces mobile  or ICEfaces mobile which I have not used or read about in-depth so can't form much of an opinion on. It seems that just about any consultant can do Javascript/jQuery/Dojo, etc but not JSF 2 which is why most of our outsourced work continues to use those frameworks. I do wish a long term TCO type analysis was performed to compare some competing solutions.

I picked up the "Node.js, MongoDB and AngularJS Web Development" book today after someone mentioned learning the stack might be beneficial.

I've used Spring core for a number of years and like it.  I am not sure yet whether I will convert to CDI based dependency injection instead though.  I would like to move to using JEE standards over other stuff if possible. I'm not sure that is viable and maybe not even a good recommendation where I am at though.  It comes down to making sure that systems are maintainable and there are people with the appropriate training and knowledge.  That is why I looked into Lift but decided that adding one more new technology stack was not supportable even if it would help reduce some issues we have/had.  An application was recently refaced and Spring MVC was used so I picked up a book to help me understand how to better deal with it.  The application wasn't done as well as was planned and now internal staff have to take over and finish/fix it. 

The PHP books started with a desire to be knowledgeable and turned into a mild need when my employer bought a new system that is PHP based but the team that owned it had no PHP knowledge and little recent development knowledge so I ended up helping out for a period while they figured out how to maintain it. 

I've bought a few Tomcat related books over the years and this was the last - they don't seem to help much more than what you find with Google. I've worked with Tomcat for so long now that there isn't usually much new to learn on it specifically.  I say that not in a bad way but meaning that the software is very stable now and can perform quite well with minimal effort - it is an extremely impressive solution.  I've had some inclination to consider TomEE as a replacement/supplement to Tomcat itself but that just means learning/leveraging JEE more than TomEE itself.

I do tend to use my CSS reference a decent amount.  I usually keep it at work usually along with one or more jQuery and Javascript books. Of course, there are plenty of web sites with info but some short reference books I find to be quicker to use at times.


Here is a dump of most of the remaining tech books - most related to some current or past work need. I implemented some integration's using Apache ServiceMix and utilizing OSGi. It was somewhat painful at times.  I had been trying to work out an overall integration plan to replace a commercial technology with Camel/ActiveMQ along with other technology available in ServiceMix but get pulled off for other projects before real progress gets done. Some aspects of the Open Source stack here work well but there are parts that I've not worked out details to and may require substantial work.  This cover stuff like monitoring integration's, managing artifacts, handling deployments and a general developer workflow (creating/maintain/converting to OSGi artifacts). A number of books cover the technology itself but I do find information lacking more and more in how to make it all work cohesively at a business level.

I did enjoy the "Don't make me think!" book.  It made a lot of sense and I wish we (my team) and others had read it before working on a couple applications.  


A bit of odds and ends except for the "Seven Concurrency Models in Seven Weeks" book which I intended to include elsewhere but had misplaced in a pile of papers next to the computer. The rest of these books are a combination of my "random on-sale picks" and my wife's undergrad/MBA related items.

Additionally, some of my Ebooks include:
  • Data Science from Scratch 
    • I've not gotten to this one yet
  • User Story Mapping
    • I've started this but moved on to more immediate work related items.
  • Functional Reactive Programming
    • Did a very quick read; interesting but would need to go back through it to get more out of it. Author has his own framework from what I recall. Need to look at this again.
  • Akka in Action 
    • Read a long while back; would like to go back and read again while trying it for a practical problem.
  • Liferay in Action: The Official Guide to Liferay Portal Development
    • Our portal is now outsourced and based on Liferay; another application is also using Liferay but not in a public visitor way.  Those are the reasons I picked this up but have not fully read it.  Most of what I'm doing doesn't involve portal changes but I would like to do some portal work at some point - another reason I picked this up.
  • Erlang and OTP in Action
    • Read this but didn't seem practical in our environment.  Still interesting though.
  • Activiti in Action
    • I really wanted to redesign parts of one application to leverage Activiti - I think it would be great to replace some hard-coded logic with something that might be (somewhat or even fully) maintained externally from the core application.It isn' looking like this will happen unless I take "spare time" which is non-existent.
  • Enterprise OSGi in Action
    • I think I got this with my paperback copy.
I'm going to work on another post for my remaining books (Christianity related along with hobby/interest such as welding, metal working, CNC stuff, gardening). Yes, I do have plenty of books and even with plenty of book cases I am double stacked - time to start giving up the items which are not useful. 

Anyways, hope you enjoyed my trip down memory lane.

Thanks for reading!
Scott

Saturday, June 11, 2016

Jenkins CI - promotion processes

I recently got around to implementing some Jenkins promotion processes for one application.  This is the first time I setup promotions for any of our builds.  It has been on my to-investigate list for a long time though.

So far, it is working out nicely.  We are on an older Jenkins version for now and I think the 2.x version has some significant workflow additions which I hope to try out sometime (sooner than later). Even with the older Jenkins/promotion setup, it is nice having some workflow in place and manageable from one place.  For various reasons, most of the processes are manually initiated except the first one (which results in deployment to a dev server after a build which is initiated when SCM changes are found during polling).

One thing that might be nice is a way to schedule a promotion once criteria are met.  With some effort, this is probably possible with some custom code and/or more jobs but having a more direct way would more convenient. My intent with this would be to use promotion to perform deployments, outside of normal use hours, to systems used for testing/training so as to not disrupt activities. I guess another option is to change the deployment processes so that promotion simply queues up the artifacts that a separate deployment process then handles. I'll have to think that one through further; for now the recent changes are at least a positive step forward.

Another item of research is whether the promotion process definitions can be simplified/shared somehow. I didn't put time into simplifying it upfront, instead I just wanted to make sure it was correct.  As long as the maintenance cost is lower than the benefits I won't complain but reducing non-development time wasters is always a plus so I will hope for continued improvement.


Thursday, June 2, 2016

Goals in software development

This is from a document I scratched down (in my mildly legible handwriting) about 5 years ago but I find that it is still worth reflecting on at times. The writing is starting to fade a bit so I decided it was time to add it to the blog. I made a few updates to mention newer ideas/technology, etc. This isn't really a complete how-to or anything - just a snapshot of what I was thinking about over a couple days a few years back. There is probably nothing surprising here even - it is to a large degree just the distillation of a number of best/good practices that I have experienced first hand and/or found documented by others. I'll probably fill in some details over time.

Just a brief description of my software development goals - these are "abilities" to strive for. This is beyond the "must meet functional requirements".
  1. Reliability
  2. Test-ability
  3. Maintainability
  4. Manageability
  5. Monitor-ability
  6. Secure-ability 
Promoting Reliability:
  • Development
    • Use source control. It amazed me that my employer had no source control when I started. Without source control it is tedious and error prone to manage anything but minimal changes with a single developer and it only gets worse with more developers.  There is minimal cost to use source control - free products exist so the main cost is in learning to use the tools and maybe some maintenance/upgrade aspects depending on the tool. With the use of SCM tools you can track the changes going into a product - which I believe is a factor in software reliability. 
    • Unit tests / regression tests.  
      • Use something like JUnit or a few alternatives. Use a mocking framework like Mockito to stub out your code to create reasonable sized test cases.
      • Depending on some factors; having developers run a basic set of unit tests as part of the source control pre-checkin process might be worthwhile. I have wondered if some sort of Eclipse / Subversion integration could be created for this. At that moment, it is something I do manually when it seems warranted. Catching silly issues before getting into source control does tend to reduce some slowdowns I experienced otherwise.
      • Automate unit/regression testing.  Use something like Jenkins to regularly perform builds. For a very small team this might be a manual process but for larger teams it should probably be done based upon source control changes occurring.
    • Use and/or write reusable libraries. I find a need to use utility type functionality in multiple applications so why not write it once, test it well and use it again. This does have a cost though - extra testing, documentation, etc.  If a utility needs a small tweak to support something new then extra testing / analysis / work is required to prevent unintended breakage of existing client code. There is some risk in using common 3rd party libraries - security issues cause a large consumption of Ibuprofen. How big the issue is can depend a lot on your organizations ability to turn-around new releases quickly with updated libraries.
    • Write some test plans and do some functional testing. If you have the resources then use some functional test automation tools as well. 
  • Architecture
    • support redundancy and failover
      • software or hardware load balancer
      • Any caching mechanism should not be a single point of failure
      • In general, reduce single point of failure situations
Promoting Test-ability:
  • Use Inversion of Control (IOC).  This promotes "configurability" and simplifies setting up tests. I use Spring for this. 
  • Create a testable architecture. There are a few books which talk about that in some detail.  
    • NOTE TO SELF: Add references.
Promoting Maintainability:
  • Use a consistent architecture
  • Don't repeat yourself (the DRY principle) 
  • Documentation
    • code
    • process/procedure
Promoting Manageability:
  • Task automation
    • Deployment tasks 
      • web/app server up/down
      • log rotating
      • archive files if desired (i.e. WAR, etc) for fast recovery if needed
      • Update filesystem permissions (to/from read-write)
  • Consistent environments
    • Don't manually update environment setups - automate it
      • Various tools (Chef, Puppet, CFEngine) should work or you can script things
Promoting Monitor-ability:
  • Implement hooks to expose metrics.  I would do this via JMX now. 
    • JVisualVM is part of the Sun/Oracle JDK and works pretty well at monitoring individual servers.
  • Reduce the number of places to review for system status.
    • Consolidate logs from multiple servers into one location.  
    • Integrate metrics into any monitoring tool you use (maybe Nagios, etc). 
    • Implement a dashboard of some sort
  • Implement self-checks.
    • application data and/or configuration consistency
    • DB/App server privilege checks
    • Static resource validations
  • Log parsing tools would be useful. Automate the trolling of logs.
    • Helps answer "when do you know you had/have a problem?"
Promoting Secure-ability:
  • This is a more recent addition. The idea being to prevent tampering whenever/wherever possible and promote the ability to determine if something was tampered with or accessed inappropriately.
  • Other "abilities" tend to support this but it is worth keeping as a separate item due to importance in this day and age.
  • I'd like to add more detail here but not sure the risk is worth it.

 Hope someone else may find something useful here.
Scott

Titus 2:7English Standard Version (ESV)

Show yourself in all respects to be a model of good works, and in your teaching show integrity, dignity,