A Few Interview Questions

by Jon Davis 7. July 2020 02:20

Just a random dump of some interview questions I submitted to my manager tonight. Enjoy them or tear them apart.

What are the differences between .NET Core, .NET Framework, and .NET Standard? Bonus: What is .NET v5 relative to these?
(.NET Framework is the original implementation of .NET developer tooling, it includes the .NET Common Language Runtime, essential system libraries, and various web and Windows architectural toolsets. .NET Core is a rewrite of the CLR and a lightweight reimplementation of system libraries and frameworks; it is portable across operating systems and highly performant. .NET Standard is a set of interfaces that allow developers to build tools that will execute on either .NET Framework or .NET Core. .NET v5 is the continuation of the vision of .NET Framework, but built entirely upon .NET Core.)
What is the difference or relationship between a "pub-sub topical message subscription service" and a "message queue"?
(A pub-sub topical message subscription service broadcasts messages to subscribing endpoints, and does not necessarily retain the messages. A message queue service collects messages for future processing. A message queue is often a subscriber to a pub-sub topical message subscription service.)
What does the acronym "S.O.L.I.D" stand for, or can you name any of the abbreviated words or terms? Can you explain any of them? 
(Single-responsibility principle--A class should only have a single responsibility, that is, only changes to one part of the software's specification should be able to affect the specification of the class. Open–closed principle--Software entities should be open for extension, but closed for modification. Liskov substitution principle--Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program [See also, design by contract]. Interface segregation principle--Many client-specific interfaces are better than one general-purpose interface. Dependency inversion principle--One should "depend upon abstractions, [not] concretions.)
What does the practice called "red green refactor" refer to?
(This is a description of the process of TDD [Test-Driven Development which LeaseHawk does not fully do, but idealizes and strives for]: Given a new requirement, start by writing a unit test for a single feature and perhaps a placeholder of implementation code so that the test can compile and run. The test must fail, as there is no implementation--if it passes, the test scenario or validation is incomplete. [Red.] Perform enough of an implementation so that the test passes. [Green.] Refactor the code so that it is clean, maintainable code.)
What does the using statement do, and what relationship does it have with object lifetimes?
(The using statement informs the programmer and the runtime that the object is expected to implement IDisposable, and that the object should be disposed of when the object's lifespan has ended. The lifespan is ended in this context when Dispose() is called automatically at the end of the using block. A disposed object generally cannot be reused.)
When might a class be expected to implement IDisposable, and why?
(IDisposable, which is the interface that ensures the Dispose() method, is typically used on classes that consume unmanaged resources--components exposed by the operating system that do not run entirely within the CLR. Examples include file streams, network access, and shared memory pools. Failure to dispose of such objects can result in catastrophic errors in the running environment, such as memory leaks, perpetually locked files, and loss of other operating system resources.)
A class that you need to use as an injected dependency keeps throwing an exception stating that the "the object has already been disposed". What do you need to change so that this injected dependency is not already disposed when it is used?
(Open question, but some answers might be: Ensure that the DI container configuration has a proper lifetime declaration ["per-request", "singleton", etc]. Inject a factory to produce an instance of the component rather than injecting an actual instance of the component. Do not allow the component to be invoked in a background thread where the main thread may have already ended.)
Describe some very basic ways to make sure that a C# class is testable and works well with other testable code.
(Open question, but some things to listen for: don't put many behaviors into one class, make sure it implements an interface, make sure it is only called by its interface and not by its concrete definition [except in unit tests], avoid "newing-up" other concrete classes and instead use dependency injection [ensure that all dependencies are passed into the constructor].)
Code you are responsible for is constantly throwing NullReferenceExceptions and KeyNotFoundExceptions. What are some ways of resolving these errors?
(Open question, but some things to listen for: manually checking for nulls, manually checking for keys, coalescing operators [a ?? b], null-conditional operator ["?." or question mark before dot], runtime safety helper methods or extension methods, and refusing to directly access dictionaries by the indexer.)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


C# | Career

March 2020 Update

by Jon Davis 18. March 2020 08:05

What's up ya'll? It's Tuesday, March 18, 2020. Everyone is on lockdown from a panic over a flu-like virus that mostly only kills old people. I'm 43, not old yet. So this is lame.

It's been a (literally) forgotten ghost town here on this blog, nobody's reading this. Except you, you weirdo. So yeah. Like I said in my last post, I just started a new job, and so I've been focusing on that. It's really interesting (I guess) how starting a job can make me so completely uninterested for so long in personal professional investment like I was doing here on this blog and what I was trying to set myself up to do. Invements in personal professional development instead become professional development investments on the job I've actually been hired to do, and while there may be some alignment, subconsciously I tell myself "don't you dare set yourself up for selfish motives that could become conflicts of interest", and so I don't.

But anyhow, yesterday I just completed the final task that I was able to contribute to without any significant skills development or rediscovery. I just looked at my available tasks list this morning, everything is either in someone else's domain or will require me to ramp up on non-proprietary tooling skills. Mostly that means Angular and React. But prior to now, what I've been working on has been all straight up server-side C# code, with zero database interaction and, I would say no user interface, but in reality it's an altogether unique kind of user interface. And that is voice and chat. I've been working on the chat bot AI system. Honestly, I've not been doing a great deal of new work, and most of the interesting stuff is actually bought, not built, but I'm definitely not complaining. Any chance to code is always a good thing. Most of the work I've been doing has been refactoring and cleanup.

And in case you're curious, the trend of refactoring I've been doing has been, first, eliminate every single instance of causation of KeyNotFoundException and NullReferenceException that the system generates. Literally sign up for the e-mail recipients list for every single exception that happens at runtime. Let no error go unnoticed, fix them as they come in. That meant 60-80 hour work weeks for a while. Second, prefer strongly typed models over generalized object dictionaries. So many of the bugs that happened in the first pass that I fixed would never have happened if the model was well defined.

But I'm getting burned out on refactoring. It's been half a year now; I've only had a couple sprints where I could actively introduce new features.

There are a couple more talking points deriving from my new job worth bringing up. The first one, I'll be brief about it: Computing is going the way of pseudo-AI and AI. By what I mean by "pseudo-AI" is, if what constitutes a "bot" is considered "AI"--a computing topic I've never really delved into--then I'm sorely disappointed, because there's nothing much to it, except maybe a lot of data that feeds into rules, a process called "machine learning". At the most simple level, then, my Outlook e-mail filter rules would constitute "AI", and that's lame. So I call it "pseudo-AI". Whatever. Anyway, the future of technology economy is more and more automation. For example, I celebrate, rather than bemoan, the introduction of kiosks at McDonald's. That just means more jobs for kiosk coders and for engineers for their setup. So be excited about cool stuff like bots and automation trends. In the case of my current workplace, the product includes support for answering the phone and actually having a decent conversation. This kind of thing can really go places.

The second talking point is, this is my first job where I've had the opportunity to work with Amazon Web Services (AWS). I've had just enough taste in my mouth to be able to sum up with great confidence my opinion on AWS, after having spent years with Azure:


  • AWS and Azure have feature parity, but only on the highest bullet-point levels
  • AWS is clunky, and many of the primary products are built on spinning up a whole clunky virtual machine (EC2 instance), most notably Beanstalk. Just modifying environment variables in Beanstalk means about 2-5 minutes of downtime while the EC2 instance shuts down and spins back up. Ridiculous.
  • It's nice that X-Ray data works its way up to CloudWatch as ServiceLens, similar to how Application Insights data works its way up to Azure Monitoring. But comparing X-Ray as AWS's supposed equivalent to Application Insights is a painful joke no one can laugh at. Better to use one of the other 500 other similar products, like New Relic, or DynaTrace. Application Insights served as both an APM and a performance metrics logging tool, but more importantly its reach in integration support goes beyond anything I've ever seen in my life, between dropping in a simple Javascript file on a front-end for tracking errors and load times and more to automatically tracking SQL Server connections and even SQL statements on the back-end. And the tooling to access the information is phenomenal; it even exports to Power BI. In my own efforts, the best I've been able to accomplish in AWS has been to combine logging to X-Ray alongside logging to ElasticSearch for redundant telemetry parity. At that point the tooling for accessing the information still remains so limited we don't really even use it all that much.
  • AWS is unreliable; ElasticSearch + kibana for example balks on dynamic index definitions with dynamic object properties and this reflects as "2 of 5 shards failed" errors with no recourse to fix it. Without having manually invoked customer service ourselves, turnaround time for it to magically resolve on its own was weeks.
  • AWS is behind on .NET support. Beanstalk released .NET Core 3.1 support on time, but Lambda services are still waiting for official support for .NET Core 3.1.
  • Unlike Microsoft, Amazon is not a software company, and it shows. Amazon is a bookseller turned A-to-Z online marketplace with physical warehousing, while AWS was just Amazon trying to capitalize on their internal IT investments.
  • But, to be fair, the evolution of AWS is not in refining existing services, but introducing new services that are actually (probably) pretty decent. Not the least of which is Kubernetes / container hosting services. I haven't had the luxury of utilizing much yet but, again, all the overall feature set is on parity with Azure at a bullet point level.
Don't get me wrong, AWS is legitimate, the suite of services is complete, and it's overall a high quality cloud. It's just not a fun experience switching to it, and no, mine is not a Microsoft-religiosity standpoint. I don't hate AWS like Linux folk hate Microsoft. What I hate is when tools are incomplete or fail. Azure has had incomplete tools and has failed, too. Just not as often, and the depth of the developer tooling and readiness is (now, recently) light years ahead of AWS. It didn't used to be. Azure went years being way behind AWS. But as of around 1997 or 1998 or so, Azure finally caught up, and got ahead. It really is quite a better cloud. 
And I miss it.
Anyway, I now have to figure out which tasks to focus on, and ramp up for. Stay safe, everyone, and be sure to lick every railing just for fun's sake. 

  Image result for lick railing

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


(Time out)

by Jon Davis 19. November 2019 21:23

Just posting in case anyone follows as to why so silent again ..

I got a new job. Waiting out the two weeks. Meanwhile all side projects and research thereof are on hold until at least after Thanksgiving.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Fediverse Microblogging Protocols: Part 1

by Jon Davis 3. November 2019 15:19

You may or may not have heard of "the Fediverse". No? How about Mastodon? If not that, surely you have heard of gab.com

Gab.com was rebuilt a year or so ago upon Mastodon's open source software system which is a microblogging web platform. It is a branded part of the Fediverse, which is a series of microblogging sites that are all able and potentially willing (via a human decision and a configuration) to talk to each other. Effectively, this is fail-safe distributed computing with social microblogging (Twitter clones) as the form of application. The objective with these frameworks was to establish a censorship-proof system of web hosting, so that people who wanted to enjoy microblogging topics that were considered outside of generally socially acceptable could always have a place to go on the Internet, because the microblogging hosts are effectively proxied out by many servers. One might say it is the dark web originating on the open, public web/Internet. 

The Fediverse was also created largely by the alt-left. These are the bizarre perverts of the world, such as nudists, or furries, people who fantasize bestiality typically via hand-drawn anime art or cosplay. Until recently, sexual deviants were considered too far strayed from the norms of society to be allowed a place on the Internet, so censorship was frequent, which is a key motivator of the Fediverse. However, gab.com, which also struggles with a history of censorship, facilitates thoughts and content from people from all walks of life, including some people on the extreme alt-right--Neo-Nazis and the like. So gab.com forked Mastodon to recreate the gab.com social network on the Mastodon framework, replacing, adding, and removing features according to Gab's whim's and needs. Needless to say, the Masdodon community proved furious about this, that alt-right zealots are allowed to have an uncensored platform, but they made this bed. 

Meanwhile I personally have been very studiously monitoring social networking technologies, companies, and trends since the beginning. I was a participant from the beginning. Like, the very, very beginning. GeoCities was the socially driven personal expression platform of choice at the beginning. My first web site was on GeoCities, until I started hosting my own domain. Then came MySpace and blogging. Everyone had "a MySpace". Then, from out of nowhere, Facebook took off, and the personalized rebranding of an individual's personal profile on MySpace was deemed exotically ugly and forever forgotten in favor of the standardized look and feel of Facebook's fixed layout and feel. All the while, Facebook's mixing of "wall" posts from various users--friends and followed feeds--was something new and amazing. It filled the gap lost by the antiquation of NNTP newsgroups and message boards. It completely changed the landscape of Internet social networking. Then came Twitter and YouTube. With YouTube, sharing your life on video became not just possible, it became a normal way for people to experience pseudo-relationships of mindsharing, complete with facial expressions and body language, with the connected world around them. The people of the world became truly cohesive, the Internet was the glue.

And then people who had traditionally held power over people's minds began to panic. Facebook and Google and the like saw their roles in the world as guidance mechanisms for swaying world opinion, and mainstream media (MSM) began to have their published opinions (*cough* .. "news") prioritized as curated "Trends". YouTube stopped allowing the popularity of everyday people to reveal their priority in searches and top-level browsing, and instead now prioritizes packaged infotainment like CNN as the primary resources to be found for any given topic. And Twitter, Facebook, YouTube, Instagram, and so on, these are all perpetually being mentioned in the (alternative) news headlines for censoring people for sharing thoughts and opinions that go against the preconceived narratives that mainstream media and big tech employees (most of which are in coastal-state or otherwise high population cities, I might add, notably San Francisco, Portland, Los Angeles, and New York City) are trying to guide the world to embrace.

This is unacceptable, but at the same time expected. As a conservative Christian, I must admit that we had "quite a ride" of privileged authority in driving society for so many decades, centuries, yet we were told by Jesus to expect that the world would hate us, that we would be the underdog. That hasn't happened in our Western society, not really, not in my lifetime. So I can't be angry that conservatism has started to move towards the back seat. Nor should I suggest we are somehow "victims". We're not. The victims are not in the West. The victims are in China, in Pakistan, in India, all over the place, other than the West. The West's time is coming. It isn't here yet, despite "progress" in multiculturalism efforts. But it's coming. This has been instilled in me since pre-Matrix anticipation even in the music I listened to as a youth.

So my interest is in watching for, supporting, and participating in censor-proof platforms, "for everyone" but including conservative Christians. This is why I've invested in Gab. I've paid for a lifetime pro membership with Gab. But I've only just gotten started.

Gab.com made their software (their fork of Mastodon) open source and published it at https://code.gab.com/. They invite the Internet community to clone it and set up Gab Social instances all over the Internet. Presumably people have. So, I tried to. I can't. Trying on both my home workstation and on my laptop, both which run on Windows 10, I am stuck with local setup failure, starting the error that webpack-dev-server never actually got itself up. Gab Social's repository doesn't seem to have a support group, there doesn't seem to be a Gab Social group on gab.com, and no one replied to my post on gab, so I'm left in the dark here, and with this I'm also seeing some serious community-related limitations of the platform in the first place.

My motives to run Gab Social and work on its code myself were indeterminate, it's not truly open source for the gab.com platform so much as disclosed source, but at minimum I wanted to see what it consisted of. But even though I can't get it up and running, and be able to adapt it to my needs and interests--without, say, who knows, maybe somehow $buying an audience with someone at gab?--I can at least see on the surface what indeed it consists of.

The Gab Social software stack consists of:

  • PostgreSQL,
  • Ruby on Rails,
  • Node.JS, 
  • Redis, and
  • ReactJS,
  • with deployments on Docker
Knowing that the software is based on Mastodon, which is a branded implementation player on the Fediverse, this means that it runs on one or more of these protocols:
Knowing the protocol(s) used for Fediverse participating software is important because it means that I as a Microsoft stack .NET developer might be able to build a microblogging-oriented social network infrastructure that is compatible with Gab Social, and perhaps integrate with it (at least to the extent of it being on the same Fediverse), without actually utilizing any of its RoR/NodeJS/etc implementation, not that I'm fundamentally opposed to RoR/NodeJS/etc.
I will be following up with a Part 2 of this blog entry when I have done more homework on these and have come to a better understanding of what's been going on here. Sadly, all of the bullet points in the last bullet points list above are foreign to me, which means I haven't been monitoring social networking tech as closely as I should have, which is particulalry shameful considering I have a number of false starts of social network platform framework side projects over the years, albeit those efforts effectively stopped right around the time these seem to have begun. 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , ,

Blog | General Technology | Software Development | Web Development | Microblogging

How do you manage focus in ramp-up?

by Jon Davis 21. October 2019 01:39

Just a brief question. How do you manage to maintain focus in ramp-up (technical self-training)? One of my great deficiencies over my career has occasionally been shown to be a failure to have deep understanding of some of the tech stack components I claim to support. And the root cause of this is that when the time came that I needed to learn up on my stuff, I got ADHD of some sort, and never followed through with deep diving and getting to the end.

22 years in the field, I've seen a lot of action and a lot of evolution of technology and watched a lot of technology trends come and go. Every new thing I learn makes me reminisce about something else I knew, or something else I heard about, or wonder what happened to that one guy who showed me how he dabbled in that such and such ...

I'll read a paragraph from a tutorial, and nitpick specific details, and ask questions about those details, and find myself spending thirty minutes researching those tangents. Eventually I'll realize I got off on a tangent--but not before taking a mental break and finding some other music to listen to, then researching what happened to that old musical artist I used to love years ago, or whatever--and then finally return to the same paragraph to finally implement the detail that the tutorial is telling me to do.

Rinse, repeat, for every. single. paragraph. As a result, twenty-minute tutorials take me two or three days to complete, or some ten or so hours. Similarly for video; I am constantly having to rewind because I think too hard on each point; a two hour video can take days (many hours) to wade through. I'm more or less enriched for all this, but it makes me a less competent professional when I put in equal time as my peers--I have to dedicate so much more time to the craft than they do, I think.

When I know my stuff I am pretty good at it, but I am floored by the depth and resolve and detail that my peers are able to demonstrate when they lay out their abilities and put them on full display. Yes, it makes me jealous. And frustrated.

I'm serious. Is there a particular kind of psychologist or other professional I should be talking to? Maybe there is some "focus pill" I can take.

Are there simple tactics or mind tricks you use to keep the ball rolling and on track?

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Prelude to a Blogging Reset

by Jon Davis 19. October 2019 22:55

I started blogging in around 2002/2003 when Blogger and Radio UserLand were inspirations for me to create a desktop blogging app I called PowerBlog. 

Archive.org: https://web.archive.org/web/20031010203956/http://powerblog.net/
PowerBlog (beta release)

My motivations were three:

  1. To grow my skill set as a software developer.
  2. To see if I could maybe make a living building and selling home-grown software. (PowerBlog was available for sale, but didn't sell.)
  3. To write, and write, and write. My brain was churning, and I wanted to divulge my thoughts out loud. 

PowerBlog was written in VB6. It consisted of an instance of the Internet Explorer WebBrowser COM object to drive a true WYSIWYG experience, design philosophies similar to those of Outlook Express (an e-mail and newsgroup client), and a publish mechanism component model including support for user-defined publishing scripts using the Active Scripting (VBScript/JScript) runtime component. When .NET v1.1 came out, I rewrote PowerBlog, reusing the same components from Microsoft but adding more features like XML-RPC--by which I built my own client/server libraries with self-documenting HTML output similar to ASP.NET's .asmx behavior--and style synchronization so that the user could edit in the same CSS style as the page itself. I tried to sell PowerBlog for $10 to $20 per download. It didn't sell. That's kind of okay, the value of my efforts was found in my skills ramp-up and in my having a tool for my own writing.

PowerBlog got Microsoft's attention. Three things happened, all of a sudden, with Microsoft: 1) the Windows Live initiative kicked off blogging from their web site (which they've since shuttered), 2) Microsoft interviewed me, and 3) Windows Live Writer was written, stealing most of the good ideas I had in PowerBlog (admittedly tidbits of the ideas of PowerBlog were stolen from another app called W.bloggar). I got nothin for it but some bragging rights for the ideas. 

I was broke. My motivators to go out on my own (taxes-related need to go offline to do some research) subsided. So I stopped development and went back out into the workforce. When .NET 2.0 came out along with a new version of Internet Explorer, it broke PowerBlog permanently. Microsoft published WebBrowser components that directly collided with the WebBrowser components I had created for PowerBlog. So PowerBlog isn't available today--it will just crash for you if you try--and I couldn't even build my own source code anymore, without finding an old Windows XP box with an old version of Visual Studio and .NET Framework 1.1\. It just wasn't worth the hassle, so I never bothered. Maintenance was immediately halted. PowerBlog.net went offline. I didn't much care. I did need to keep blogging and writing, so eventually I found BlogEngine.net and transferred my technical blog content to it. I updated the blog engine code once or twice as it evolved, but eventually I just let it sit dormant.

So that's where my tech blog instance stands today. http://www.jondavis.net/techblog/ runs on a decade old version of BlogEngine.net which I've tailored a bit to include banned IPs and some home-grown CAPTCHA functionality for the comments. I've since looked at a few other blogging engines over the years I've considered adopting, most notably I remember looking at NBlog, which gave me the most control but required me to implement it in code and didn't sufficiently demonstrate black box modularity, and Ghost, which would grow me in NodeJS but ticked me off in its stance on only using Markdown and never WYSIWYG HTML editing. 

Meanwhile, the whole time, developers and non-developers alike have pooh-poohed the interestingness of blogs, blogging software, blogging strategies, blogging services, etc. I can certainly see why. At its most basic level, blogs are little more than single-table CRUD apps. You have an index of recent blogs, you have a detail view of an individual blog post, you have an editor and creator page, and you can delete a blog post. The content of a blog post is, to the casual observer, nothing but four components: title, body, author, and publish date. If that's what you think a blog is, you're naive, and likely didn't bother reading this far.

At the very least, on the technical side, blogging brought about a few innovations that revolutionized the Internet, including: 

  • XML-RPC (SOAP's midget predecessor)
  • RSS
  • Publish pings
  • Atom
  • OPML
Not to mention less specific innovations, like end user accessible management of slugs (URL paths) for enhancing SEO. And the whole notion of blogging became the basis of the World Wide Web's notion of community interconnectivity. The broad set of Web sites was social networking, before social networks took over social networking. Blog sites were known, and linked to each other. Followers of blogs created view counts that filled the hole that Facebook post likes fill today. 
This is perhaps why dev.to is such a success story; it's like a Facebook group, for coders, where every single post is a blog article.
Anyway, so now I sit here typing into the ten year old deployment of BlogEngine.net on my resurrected tech blog, wondering what my next steps should be. Well, I'm pretty sure I want to create my own blog engine again, and build on it. Yes, it's a two decades stale idea, but here are my motives:
  • My blog philosophies still differ somewhat from the offerings currently available (although not far at all from BlogEngine.net)
  • I want to keep growing my technical skill set (not just write about them). There are revised web and software standards I need to freshen up on, and apply my learnings. Creating a blog site has always been a good mechanism to sample and apply the most basic web tech skills.
  • I need anything I deploy to a technical blog to portray my own personal portfolio, including the site on which my writings are displayed
  • I still like the idea of taking something I myself created and putting it out on github as a complete package and perhaps managing a hosted instance of it, similar to WordPress.
All this said, I don't think I'll be doing a full-blown BlogEngine.net equivalence. It will be a simple thing, and from that I'll take some ideas to glean from and apply them to other software efforts I'll be working on. 
But a few things I will point out about the technical strategies and approaches I intend to implement:
  1. Rich front-end libs (React, Vue, Blazor, etc)?? While I might take, say, Ghost's approach in having some rich interactivity for the author's experience, the end user (reader) experience cannot be forced to utilize them. A blog page must be rich in HTML semantics and index well SEO-wise for the web at large, so the HTTP response payload cannot be Javascript stub placeholders for dynamic content.
  2. Componentization is more important than anything else. I do intend to iterate over a lot of the features this old instance of BlogEngine.net has as well as current blog engines, and figure out ways to spoonfeed those features without embedding them deeploy in interdependencies. Worst thing I could do is embed all the bells and whistles directly into ASP.NET Razor Pages themselves. I intend to apply decorator pattern principles, perhaps applying sidecar architecture for some components where appropriate. Right now I'm looking at using Identity Server 4, for example, as a sidecar architecture for author identity and privileges. Speaking of which,
  3. Everything must be readily run-anywhere, black-box-capable deployable as ad hoc code launched with self-hosting, Azure web app service (PaaS), Docker-contained, or VM (IaaS). I also intend to set up a hosted instance and offer limited blog hosting for free, extended features for a fee. In this sense, WordPress is a competing platform.
  4. "Extended features, like ..?"  Premium templates. Large storage hosting. And premium add-on features yet to be defined.
  5. The templates can be based on Razor, but "pages" cannot be tightly defined. If this platform grows up, it needs to be a more than a blog, it needs to be a mini-CMS (content management system).
  6. Social networking ecosystem is a mandatory consideration; full blogging must integrate with microblogging and multi-contributor cross-pollination including across disparate sites and systems; more on this later, but imagine trusted Twitter users liking Facebook posts.
Again, yes, I am unpacking a two decades old solution proposal to a Web 1.0 / 2.0 problem, but that problem never really went away, it just became less prominent. I really don't anticipate this blowing up to being much of anything. At a minimum, I need to convert all of my content here on this technical blog (at http://www.jondavis.net/techblog/) to a home-grown platform of my own making, even if after doing that I call it done and walk away.
Another motivator for getting that done is the fact that just writing this, I'm writing with very tiny text on a very high resolution screen, and you're probably squinting reading this, too, if you're reading it from my web site, and if you actually made it this far. Again, yes, I could simply just replace the template and maybe refresh the version of BlogEngine.net which I'm using. But, why do that, when I call myself a 23-years-plus experienced web development veteran and could just build my own? Am I really so useless in my aging as to be unable to build something of my own again? Not like a blog engine will get me a better job, duh, so much as the fact that using someone else's engine just plain looks bad on me. So, this is a lightweight test of mettle. I need to do this because I need to.
On a final note, I'll mention again what I'm focusing on first: "who am I"--authentication and authorization. I'm learning up on Identity Server 4. I'm still new to it, so this will take some time. Right now it looks like the black box version of my blog engine will come with an instance of Identity Server 4, based perhaps on ASP.NET Core Identity as the user store; developers can tweak it out to their heart's content. I'm still mulling over whether to just embed it into the blog app (underkill? too much in one?) or separate it out as a separate SSO-oriented web app (overkill? too many distributed parts for a mere blog?), but at this point I'll likely do the former for the black box download (source code included) and the latter for the hosted instance which I hope to set up and offer to people wordpress.com-style.


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Blog | General Technology | Web Development

Time to blow off some dust, toot my own horn, and hit the books

by Jon Davis 14. October 2019 23:59

Woah, Nelly!

Jon Davis's blog is back up! Last post was .. more than three years ago! Daaaang! How ya'll been?! Missed ya'll! Miss me?

I'm just posting a quick update here to let ya'll know that the gears in my tech world have started turning again, and to update ya'll on what's going on.

You may or may not have noticed that my root web site http://jondavis.net/ went through a couple phases and got stuck with that dorky "please wait" console-ish page. I was supposed to have replaced it by *cough* .. 2016. It's now approaching the year 2020. What happened? Well what happened was I got a few kicks in the pants. Got myself into some really humbling situations, not the fun kind. Perhaps you might say I got phased out. But I never left, so now I'm in high gear phasing back in.  I might try to explain ...

A few blog entries ago (this goes back to 2014) I wrote about how I needed to reset things, and how I needed to mull over what was going on at work. So here's a recap on my career path lately up till my previous job:


  1. In 2012 I was hired at Neudesic, a prominent consultancy firm. I dreamed of surrounding myself with smart people I could glean from. It turned out that things were pretty erratic at Neudesic. My first project assignment the client was Microsoft themselves. Prior to my joining they had just canned a project to build a big, beautiful Windows 8 themed web site where developers and other staff would post all-important articles and index them with Lucene.NET. Architecturally it was a disaster, and they canned the Microsoft executive at the same time they canned the project. So my joining the team, they were trying to salvage that project. I worked with them to try to dig into the code, get it up and running, figure out the performance issues, etc., and at some point I flew out to Redmond, Washington to discuss with the local Neudesic managers who were interfacing with Microsoft in person. Then I opened my mouth. I said, "Ya'll are really just makin' a blog. Why not add blog-ish things? Why reimplement Sharepoint?" Suddenly we were all fired. So then they shipped me off to Pulte Homes, where I did some work there, but the architect for that project and I didn't seem to know what we were doing on the user authorization detail and I proved blunt enough that they "couldn't afford" to keep me on after a couple months. So then they shipped me off to California to work with Ward & Brown on the Obamacare / ACA implementation there, again late to the party and annoyingly insistent to "help". But when QA and I asked around where the production/staging servers were, and they realized they apparently missed that part, they canned all their contractors. All 250 of us. So there I was stuck in the Neudesic-Phoenix office waiting for them to call me in. And they did. They laid me off. Like the child-man that I was, I accidentally let them catch me choking. They did say they might be able to take me back in a few months, though, so ...
  2. For the next few months I did some contract work for a local entrepeneur. I waited that out for a while and ultimately I wanted to go back to Neudesic, so ...
  3. In mid-year 2013 I asked Neudesic to take me back in. They did. They brought me back with open arms. It was more awkward for the lot of them than I or anyone anticipated. I'd made myself a reputation for being unrefined up to that point, I'm pretty sure. But anyway, when I arrived (a second time) I noticed that more people, including my former manager, were no longer there. They were laid off too. And I shipped back to Pulte Homes, on another, bigger project. I was up front with them, though, about what specific tools I was unacquainted with, specifically Bootstrap and the like, at the time. They shrugged that off, brought me in anyway. That project was led by--ima be frank here--a really, REALLY bitchy, control freakish, PMS-y woman. I tried to overlook it at the time. I tried to pretend it wasn't so at the time. I'm thinking back half a decade now, and I'm saying it like how I witnessed it. She was horrible. If I ever get in a situation like that again I'll run for the hills. That was awful. She was awful. But anyway, at the time, overlooking that (which I deliberately did), since the lead personality who'd previously been on that project but was laid off was now gone, and I wasn't getting much in the way of introduction, I deliberately, if bombastically, made a ton of assertions and at the same time asked a lot of really stupid, ignorant questions, which ticked off everyone on the team. So they canned me from the team. So that was fun. But what really did me in was I overheard the Neudesic chief developer director guy tell my boss that I "shouldn't be writing software". They assigned me some out-of-state ops role. I should have quit then and there; sure, I screwed up, but I'm a developer, not an ops guy. I didn't last long, and I ultimately did resign.
  4. So now in 2014 I got a very odd and delightfully educational gig with DeMark Analytics. So first of all, Tom DeMark, the owner, is a wealthy financial technician (a term I never knew before) who did what I imagined doing some years back--he studied financial charts and came up with artificially intelligent algorithms that predicted changes in the market. He's one among many people who come up with this stuff, but even so, that's what he did. So now they were building a product for people who could use these financial chart studies--a charting app, basically, with studies being overlaid over the chart. This entailed financial event data being siphoned in to both the back-end engine as well as to the client (the web browser). This is high tech stuff, and the pattern in use was CQRS-ES, which I'd never heard of much less mastered. So here's where it all broke down: 1) We all sat in close proximity to each other. No privacy. All conversations fully exposed. 2) I was hired as a lead, but I was wrong a couple times when I was adament, it was observed by the teammates, and so my authoritative experience as a lead developer was never trusted again. 3) Everyone in the company but maybe four of us was either family to Tom DeMark or close friends of Tom DeMark. It was a nepositic environment. I worked under one of Tom's sons (he was CEO/President), and another of Tom's sons worked under me--well, alongside me, since me being lead didn't work out. He was a bit spoiled. Quick on the Javascript, though, I couldn't keep up with his code, which was charting graphics. Like, at all. So I stopped trying. 4) My pay was adequate (best I can say about it) but my paycheck was cut monthly. Weird, bizarre, and painful. But it was worth it, I was investing in this, I figured. 5) My direct boss was a super high IQ ass. I asked technical questions about the middle/back end from him, like about how Cassandra was to be used, and instead of answering, he'd call everyone over--the CSS front-end developers, everyone. Then ask me to ask my question again. All to I guess humble me? .. Show me that this was "duh" knowledge that everyone would know and understand? So where this went critical was 6) I again used rhetoric. Crap, man. This pretty much got me fired. I used rhetoric! What I mean is, I insinuated, in so many words, that "your explanation sounds vague, and if I didn't know any better I'd say it almost sounds like you said [something obviously stupid]". Except I didn't say it like that, I actually, literally said, ".. you mean [something obviously stupid]?" I really, truly, genuinely trusted that he understood that I was being rhetorical, but this was the second time I made that mistake--I made the same mistake at Neudesic, "I can't read that [Javascript code]", I could, but I was getting at I shouldn't have to stop and read it--and with these guys it was sabotage. A few minutes later after we returned to our desks he threw his hands up and announced he was switching to Java/Scala. "Sorry Jon." Sorry, Jon? So yeah he was basically saying "you're fired, please quit." It took a couple more months, but I eventually did.
  5. So then I work at another consultancy firm. Solution Stream. Utah-based. They seemed to be trying to spread out into Phoenix. "I can do this," I thought. I learned at Best Software (Sage Software) when I moved to Arizona how consultants--consultants, not contractors--work, and bring prestige to the process of coming up with technical solutions and strategies, documenting them, and working them with the clients. But Solution Stream was really primarily just interested in creating contractors, apparently, but regardless, they didn't appreciate what I brought to the table, they undersold my capabilities, the executives decided they didn't like me, and they literally pulled me off a project that the client and my direct boss said I was doing great with and signed me over to Banner Health as a temp-to-hire (fire). I had no interest in being hired as a permanent Banner Health employee. When my temp-to-hire contract ended (the "temp-" part), everything ended. I swore off all consulting firms at that point. No more consulting firms. Never again.
  6. So then I got picked up at InEight. Bought out by major construction company Kiewit, InEight was building a cloud version of their Hard Dollar desktop app which manages large scale construction logistics (vendors, materials, supplies, etc). They had some workable plans and ideas. But things broke down real fast. Everyone who interviewed me quit within the year I joined, and it wasn't hard to see why. 1) They had non-technical people at the helm (senior leadership) making some very expensive and frustrating platform and architecture decisions. High performance software with minimal performance hosting, nothing worked, because they didn't want to spend the money for scaling the web tier. 2) The work was outsourced. Most of it was outsourced to India. Eventually they shipped some of it onshore to another midwestern state. But even onshore, most of their staff were H1-B visa holders. Foreigners. Nearly everyone I was working with was from India. Even after so many people quit, I stuck around as long as I could. But eventually I couldn't stand things anymore, my career path had become stagnant, and I knew I couldn't work with the senior executives (no one could, except people from India I guess). I was about to give two weeks notice, when those senior execs pulled me into a room and chewed me out for being "disrespectful". I was done. Never saw them or anyone over there again. (Actually, that's not entirely true; I have maintained strong friendship with at least one colleague from there. He got laid off a few months after I left. We're friends; we literally just met up this week.)
  7. For the last year and a half I've been working ... somewhere. For now. I came in as a lead developer, but they, too, openly declared me "disrespectful", so I've given up and just been a highly productive, proficient, heads-down programmer. This place, too, is mostly H1-B visa holders from India. I'm surrounded by foreigners. Scarcely a black, white, or Mexican face. It's depressing. I have less and less each year against Indians but my God, let me work with people of my own culture if I'm here in USA, just a few like-minded, like-raised friends, just a few? And now my team is getting dismantled, due to a third party taking over what we're doing. So I'm about to get laid off. If I'm not laid off, though, well, ... 1) as a contractor, I don't get paid holidays, I don't get paid vacations, and that was painful enough, but unexpectedly after my hire it turns out there is a mandatory two weeks unpaid leave during Christmas & New Year's, and that's unacceptable ($thousands of $dollars lost, not to mention depressing since I spend holidays alone, so yes, it's unacceptable). 2) I have been super comfortable, and super complacent, with little to gain in technical growth. It's been ASP.NET MVC with SQL Server and jQuery. And some .NET Core 2.2 and Razor Pages. Woo wee. *sigh* So yeah, I'm open to change, regardless of whether I get laid off.
There's my life story for the last seven years. Stupid, depressing, awful, I've been awful, I've let myself screw myself over time and time again. So here is my new strategy.

I have no one to blame, even where I've whined and complained, I have no one to blame for my life's frustrations but myself. It's part of the maturing process. I've embraced my learnings and I will carry on. I will try to let go of the past, but I only repeat and document them here because I have learned from them, and perhaps you can, too. What do I want in my career path? I miss the days when I was an innovator.

You guys remember AJAX? Yeah? I dreamed up AJAX in 1998 when IE4 came out. I called it "TelnetGUI". Stupid name. Other people came up with the same idea a few years later and earned the credit.

You guys remember Windows Live Writer? Yeah? ... Total rip-off of my PowerBlog app, down to detail. You could say I prototyped Windows Live Writer before Microsoft started working on Windows Live Writer. Microsoft even interviewed me after I built PowerBlog, because of PowerBlog and its Microsoft-minded inspirations of component integration. Jerk interviewer was like, "Wait, you mean you don't know C++?! Oh good grief, I thought you were a real programmer." Screw you, Microsoft interviewer. LOL. Anyway, Windows Live Writer came out a couple years later. Took all of PowerBlog's fundamental ideas, even down to the gleaning the CSS theme and injecting the theme into the editor.
You guys remember PowerShell? Yeah? I prototyped the idea in or around 2004. I took the ActiveScript COM object, put it in a C++ console container, spoonfed some commands where you could new-up some objects and work with them in a command-line shell, suggested that the sky's the limit if you integrate full-blown .NET CLR and shell commands in this, and showed it to the world on Microsoft's newsgroups. Microsoft was watching; I planted a seed. A year or so later, PowerShell ("Monad") was previewed to the world. I didn't do the dirty work of development of it, but I seeded an idea.
You guys remember jQuery UI? Yeah? I cobbled together a windowing plugin for jQuery a year or two before jQuery UI was released. It was called jqDialogForms. Pretty nifty, I thought, but heck, I never got to use it in production.  
In fact there's a lot of crap in my attic I recently dug out and up over at https://github.com/stimpy77/ancient-legacy (It really is crap. Nothing much to see.)
And, oh yeah, you guys remember Entity Framework, Magical Unicorn Edition? I, too, had been inspired by Fluent NHibernate, and I, too, was working on an ORM library I called Gemli [src]. Sadly, I ended up with a recursion nightmare I myself stopped being able to read, development slowed to a halt, and then suddenly Microsoft announced that EF Magical Unicorn Edition, and I observed that it did everything I was trying to do in Gemli plus 99x more. So that was a waste of time. Even so, that was mini-ORM-of-my-own-making #2 or #3. 
All of these micro-innovations and others are years old, created during times of passion and egotistical self-perception of brilliance. What happened?! I think we can all see what happened. My ego kept bulldozing my career. My social ineptitude vanquished my opportunities. And I got really, really lazy on the tech side.
My blog grew stagnant because, frankly, career errors aside, my bold and lengthy philisophical assertions in my blog articles were pretty wrong. Philosophies like, "design top down, implement bottom up". Says who? Why? I dunno. Seemed like an interesting case to make at the time. But then people at meetups said they knew my name, read my blog, quoted my article, and I curled up and squealed and said "oh gawd I had no idea what I was writing". (Actually I just nodded my head with a smile and blushed.) 
For the last few weeks I have spent, including study time, more than 70 hours a week, working. Working on hard skills growth. Working on side project development--brainstorming, planning. Working on fixing patchy things, like getting this blog up, so I can get into writing again. It's overdue for a replacement, but frankly I might just switch over to http://dev.to/ like all the young cool kids. 
Tech Things I Am Paying Attention To 
.NET Core 3 is where it's at, .NET 5 is going to be The Great .NET Redux's great arrival. However, the JVM has had a huge comeback over the last half-decade, and NodeJS and npm like squirrelly cats have been sticking their noses in everything. Big client-side Javascript libraries from a year or two ago (Facebook's React, Google's Angular, China's Vue) are now server-side for some dumb reason. Most importantly, software is becoming event-driven. IaaS is gone. PaaS is passe. Kubernetes is now standard, apparently. Microsoft's MSMQ is so 1990s, RabbitMQ so 00's, LinkedIn's Kafka is apparently where it's at, and now Yahoo!'s Pulsar is gaining noteriety for being even more performant. 
My day job being standard transactional web dev with ASP.NET/jQuery/SQL has made me bewilderingly ansy. If I want to continue to be competitive in complex software architecture and software development I've got to really go knee deep--no, neck deep--in React/Angular/Vue on the front-end, MongoDB, Hadoop, etc on data, Docker/Kubernetes on the platform, Kafka on the data transfer, CQRS+ES on the transaction cycles, DDD as the foundation to argue for it all, and books to explain it all. I need to go to college, and if I don't have time or money for that I need to be studying and reading and challenging myself at all hours I am free until I am confident as a resource for any of these roles.
Enough of the crap reputation of being a wannabe. Let's be. 


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


C# | Career | General Technology | Health and Wellness | Open Source | Opinion | Pet Projects | Social Networking | Software Development | Unresolvable

Technology Status Update 2016

by Jon Davis 10. July 2016 09:09

Hello, peephole. (people.) Just a little update. I've been keeping this blog online for some time, my most recent blog entries always so negative, I keep having to see that negativity every time I check to make sure the blog's up, lol. I'm tired of it so I thought I'd post something positive.

My current job is one I hope to keep for years and years to come, and if that doesn't work out I'll be looking for one just like it and try to keep it for years and years to come. I'm so done with contracting and consulting (except the occasional mentoring session on code mentor -dot- io). I'm still developing, of course, and as technology is changing, here's what's up as I see it. 

  1. Azure is relevant. 
    The world really has shifted to cloud and the majority of companies, finally, are offloading their hosting to the cloud. AWS, Azure, take your pick, everyone who hates Microsoft will obviously choose AWS but Azure is the obvious choice for Microsoft stack folks, there is nothing meaningful AWS has that Azure doesn't at this point. The amount of stuff on Azure is sufficiently terrifying in quantity and supposed quality enough to give me a thrill. So I'm done with hating on Azure, after all their marketing and nagging and pushing, Microsoft has crossed a threshold of market saturation that I am adequately impressed. I guess that means I have to be an Azure fan, too, now. Fine. Yay Azure, woo. -.-
  2. ASP.NET is officially rebooted. 
    So I hear this thing called ASP.NET Core 1.0 formerly known as ASP.NET 5 formerly known as ASP.NET vNext has RTM'd, and I hear it's like super duper important. It snuck by me, I haven't mastered it, but I know it enought to know a few things:
    • It's a total redux by means of redo. It's like the Star Trek reboot except it’s smaller and there are fewer planets it can manage, but it’s exactly like the Star Trek reboot in that it will probably implode yours.
    • If you've built your career on ASP.NET and you want to continue living on ASP.NET's laurals, now is not the time to master ASP.NET 1.0 Core. Give it another year or two to mature. 
    • If you're stuck on or otherwise fascinated by non-Microsoft operating systems, namely Mac and Linux, but you want to use the Microsoft programming stack, you absolutely must learn and master ASP.NET Core 1.0 and EF7.
    • If all you liked from ASP.NET Core 1.0 was the dynamic configs and build-time transpiles, you don't need ASP.NET Core for that LOL LOL ROFLMAO LOL LOL LOL *cough*
  3. The Aurelia Javascript framework is nearly ready.
    Overall, Javascript framework trends have stopped. Companies are building upon AngularJS 1.x. Everyone who’s behind is talking about React as if it was new and suddenly newly relevant (it isn’t new anymore). Everyone still implementing Knockout are out of the loop and will die off soon enough. jQuery is still ubiquitous and yet ignored as a thing, but meanwhile it just turned v3.

    I don’t know what to think about things anymore. Angular 2.0 requires TypeScript, people hate TypeScript because they hate transpilers. People are still comparing TypeScript with CoffeeScript. People are dumb. If it wasn’t for people I might like Angular 2.0, and for that matter I’d be all over AureliaJS, which is much nicer but just doesn’t have Google as the titanic marketing arm. In the end, let’s just get stuff done, guys. Build stuff. Don’t worry about frameworks. Learn them all as you need them.
  4. Node.js is fading and yet slowly growing in relevance.
    Do you remember .. oh heck unless you're graying probably not, anyway .. do you remember back in the day when the dynamic Internet was first loosed on the public and C/C++ and Perl were used to execute from cgi-bin, and if you wanted to add dynamic stuff to a web site you had to learn Perl and maybe find Perl pearls and plop them into your own cgi-bin? Yeah, no, I never really learned Perl, either, but I did notice the trend, but in the end, what did C/C++ and Perl mean to us up until the last decade? Answer: ubiquitous availability, but not web server functionality, just an ever-present availability for scripts, utilities, hacks, and whatever. That is where node.js is headed. Node.js for anything web related has become and will continue to be a gigantic mess of disorganized, everyone-is-equal, noisily integrated modules that sort of work but will never be as stable in built compositions as more carefully organized platforms. Frankly, I see node.js being more relevant as a workstation runtime than a server runtime. Right now I'm looking at maybe poking at it in a TFS build environment, but not so much for hosting things.
    I will always have a bitter taste in my mouth with node.js after trying to get socket.io integrated with Express and watching the whole thing just crumble, with no documentation or community help to resolve it, and this happened not just once on the job (never resolved before I walked away) but also during a code-mentor mentoring session (which we didn't figure out), even after a good year or so of maturity of the platform after the first instance. I still like node.js but will no longer be trying to build a career on it.
  5. Pay close attention and learn up on Swagger aka OpenAPI. 
    Remember when -- oh wait, no, unless you're graying, .. nevermind .. anyway, -- once upon a time something called SOAP came out and it came with it a self-documentation feature that was a combination of WSDL and some really handy HTML generated scaffolding built into web services that would let you manually test SOAP-based services by filling out a self-generated form. Well now that JSON-based REST is the entirety of the playing field, we need the same self-documention. That's where Swagger came in a couple years ago and everyone uses it now. Swagger needs some serious overhauling--someone needs to come up with a Swagger-compliant UI built on more modular and configurable components, for example--but as a drop-in self-documentation feature for REST services it fits the bill.
    • Swagger can be had on .NET using a lib called Swashbuckle. If you use OData, there is a lib called Swashbuckle.OData. We use it very, very heavily where I work. (I was the one who found it and brought it in.) "Make sure it shows up and works in Swagger" is a requirement for all REST/OData APIs we build now.
    • Swagger is now OpenAPI but it's still Swagger, there are not yet any OpenAPI artifacts that I know of other than Swagger. Which is lame. Swagger is ugly. Featureful, but ugly, and non-modular.
    • Microsoft is listed as a contributing member of the OpenAPI committee, but I don't know what that means, and I don't see any generic output from OpenAPI yet. I'm worried that Microsoft will build a black box (rather than white box) Swagger-compliant alternative for ASP.NET Core.
    • Other curious ones to pay attention to, but which I don't see as significantly supported by the .NET community yet (maybe I haven't looked hard enough), are:
  6. OData v4 has potential but is implementation-heavy and sorely needs a v5. 
    A lot of investments have been made in OData v4 as a web-based facade to Entity Framework data resources. It's the foundation of everything the team I'm with is working on, and I've learned to hate it. LOL. But I see its potential. I hope investments continue because it is sorely missing fundamental features like
    • MS OData needs better navigation property filtering and security checking, whether by optionally redirecting navigation properties to EDM-mapped controller routes (yes, taking a performance hit) or some other means
    • MS OData '/$count' breaks when [ODataRoute] is declared, boo.
    • OData spec sorely needs "DISTINCT" feature
    • $select needs to be smarter about returning anonymous models and not just eliminating fields; if all you want is one field in a nested navigation property in a nested navigation property (equivalent of LINQ's .Select(x=>new {ID=x.ID, DesiredField2=x.Child.Child2.DesiredField2}), in the OData result set you will have to dive into an array and then into an array to find the one desired field
    • MS OData output serialization is very slow and CPU-heavy
    • Custom actions and functions and making them exposed to Swagger via Swashbuckle.OData make me want to pull my hair out, it takes sometimes two hours of screaming and choking people to set up a route in OData where it would take me two minutes in Web API, and in the end I end up with a weird namespaced function name in the route like /OData/Widgets/Acme.GetCompositeThingmajig(4), there's no getting away from even the default namespace and your EDM definition must be an EXACT match to what is clearly obviously spelled out in the C# controller implementation or you die. I mean, if Swashbuckle / Swashbuckle.OData can mostly figure most of it out without making us dress up in a weird Halloween costume, surely Microsoft's EDM generator should have been able to.
  7. "Simple CRUD apps" vs "messaging-oriented DDD apps"
    has become the new Microsoft vs Linux or C# vs Java or SQL vs NoSQL. 

    imageThe war is really ugly. Over the last two or three years people have really been talking about how microservices and reaction-oriented software have turned the software industry upside down. Those who hop on the bandwagon are neglecting to know when to choose simpler tooling chains for simple jobs, meanwhile those who refuse to jump on the bandwagon are using some really harsh, cruel words to describe the trend ("idiots", "morons", etc). We need to learn to love and embrace all of these forms of software, allow them to grow us up, and know when to choose which pattern for which job.
    • Simple CRUD apps can still accomplish most business needs, making them preferable most of the time
      • .. but they don't scale well
      • .. and they require relatively very little development knowledge to build and grow
    • Non-transactional message-oriented solutions and related patterns like CQRS-ES scale out well but scale developers' and testers' comprehension very poorly; they have an exponential scale of complexity footprint, but for the thrill seekers they can be, frankly, hella fun and interesting so long as they are not built upon ancient ESB systems like SAP and so long as people can integrate in software planning war rooms.
    • Disparate data sourcing as with DDD with partial data replication is a DBA's nightmare. DBAs will always hate it, their opinions will always be biased, and they will always be right in their minds that it is wrong and foolish to go that route. They will sometimes be completely correct.

  8. Integrated functional unit tests are more valuable than TDD-style purist unit tests. That’s my new conclusion about developer testing in 2016. Purist TDD mindset still has a role in the software developer’s life. But there is still value in automated integration tests, and when things like Entity Framework are heavily in play, apparently it’s better to build upon LocalDB automation than Moq.
    At least, that’s what my current employer has forced me to believe. Sadly, the purist TDD mindset that I tried to adopt and bring to the table was not even slightly appreciated. I don’t know if I’m going to burn in hell for being persuaded out of a purist unit testing mindset or not. We shall see, we shall see.
  9. I'm hearing some weird and creepy rumors I don't think I like about SQL Server moving to Linux and eventually getting itself renamed. I don't like it, I think it's unnecessary. Microsoft should just create another product. Let SQL Server be SQL Server for Windows forever. Careers are built on such things. Bad Microsoft! Windows 8, .NET Framework version name fiascos, Lync vs Skype for Business, when will you ever learn to stop breaking marketing details to fix what is already successful??!
  10. Speaking of SQL Server, SQL Server 2016 is RTM'd, and full blown SSMS 2016 is free.
  11. On-premises TFS 2015 only just recently acquired gated check-in build support in a recent update. Seriously, like, what the heck, Microsoft? It's also super buggy, you get a nasty error message in Visual Studio while monitoring its progress. This is laughable.
    • Clear message from Microsoft: "If you want a premium TFS experience, Azure / Visual Studio Online is where you have to go." Microsoft is no longer a shrink-wrapped product company, they sell shrink wrapped software only for the legacy folks as an afterthought. They are hosted platform company now all the way. .
      • This means that Windows 10 machines including Nokia devices are moving to be subscription boxes with dumb client deployments. Boo.
  12. imageAnother rumor I've heard is that
    Microsoft is going to abandon the game industry.

    The Xbox platform was awesome because Microsoft was all in. But they're not all in anymore, and it shows, and so now as they look at their lackluster profits, what did they expect?
    • Microsoft: Either stay all-in with Xbox and also Windows 10 (dudes, have you seen Steam's Big Picture mode? no excuse!) or say goodbye to the consumer market forever. Seriously. Because we who thrive on the Microsoft platform are also gamers. I would recommend knocking yourselves over to partner with Valve to co-own the whole entertainment world like the oligarchies that both of you are since Valve did so well at keeping the Windows PC relevant to the gaming markets.

For the most part I've probably lived under a rock, I'm sure, I've been too busy enjoying my new 2016 Subaru WRX (a 4-door racecar) which I am probably going to sell in the next year because I didn't get out of debt first, but not before getting a Kawasaki Vulcan S ABS Café as my first motorized two-wheeler, riding that between playing Steam games, going camping, and exploring other ways to appreciate being alive on this planet. Maybe someday I'll learn to help the homeless and unfed, as I should. BTW, in the end I happen to know that "love God and love people" are the only two things that matter in life. The rest is fluff. But I'm so selfish, man do I enjoy fluff.  I feel like such a jerk. Those who know me know that I am one. God help me.

image  image
Top row: Fluff that doesn’t matter and distracts me from matters of substance.
Bottom row: Matters of substance.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


ASP.NET | Blog | Career | Computers and Internet | Cool Tools | LINQ | Microsoft Windows | Open Source | Software Development | Web Development | Windows

Many Users Still Not Drinking The NuGet Kool-Aid

by Jon Davis 22. July 2015 02:40

Yesterday (I say “yesterday” as if it was a day ago, but it’s 1:50 AM and I need some sleep) three employees of my client’s and I spent an hour, plus just themselves another hour prior, trying to fuss and fiddle to get TFS 2012 solution to build a project. The problem: we were choosing not to include the NuGet packages binaries into TFS, but NuGet packages were not properly getting restored.

The team I’m currently supporting manages literally tens (more than 100, actually) different deployed I.T. solutions, some of them old, some of them new, most of them rather small, and all of them needing to be maintained on a regular basis simply because “technology”. Only a very small handful of these solutions actually use NuGet, thank heavens. The rest of the apps just go the old fashioned method of having a “lib” directory (actually a “References” folder or “ProjectReferences” folder but whatever, other companies I’ve been in call it “lib”). I’ve been with or consulted with at least 15 to 20 different companies or more over my career, and among those who knew about NuGet (about four or five or so) the majority of my experiences have seen the teams treat NuGet like a virus. And with good reason, too. Multiple projects means multiple different iterations of fetching “whatever flavor of Package X is out there”. Multiple employees means multiple different package choices. Throw it all together and you end up with a mess of four or five different versions of client-side and server-side NuGet packages all from different times by different people, and at the end of it all it’s so often a hackfest to get Visual Studio and whatever CI build server to cooperate with the whole package restore process at all.

And package restore has another fundamental flaw by design: being what it is, it actually expects the build to download dependencies in order to build. The TFS build server doesn’t have Internet access. The team will never give the TFS build server Internet access, not to fetch NuGet packages, not for any other reason. The team controls dependencies, as many enterprises should. So NuGet packages are copied out to a corporate Windows file share on the WAN. On the local developer workstations, Visual Studio is set up to only apply NuGet packages from this share. But TFS isn’t Visual Studio.

But that wasn’t even the only issue. In our case yesterday whoever worked on this solution forgot to right-click on the solution in Solution Explorer and click on the magical menu option, “Enable package restore for this solution”. Oh, we had been through this before. Hours and hours of repeat fiddling in projects past had led to team documentation about the proper process .. and, ironically, the magical menu option wasn’t even documented. Rather, “find the .nuget folder from another working NuGet-based application and bring them over into your solution’s solution folder, then manually edit the solution and project.” Great. So now we’re literally opening up the .csproj—XML gobbligook I’ve only recently become comfortable with because of what led to Fast Koala, but up to that point .csproj files were black magic to me—and throwing in custom <Target> tags and <PropertyGroup> properties and <ItemGroup> items, .. oh my! But in our case yesterday, since we did use the magical menu item, we initially tried to deploy with (mostly) defaults in the generated .nuget folder, but because of our unique solution/project team convention folder structure we had to move the packages folder around. (We also had to manually declare our Windows file share for NuGet package sources. But we had documented this.) This meant we had corrupt NuGet package references in the projects that already referenced the NuGet packages from before we set up package restore for the solution. So we reinstalled the NuGet packages. And we discovered that the binaries were then somehow not referenced. So we manually added the binary references, pointing to the packages folder. It still didn’t work on TFS. So we uninstalled the NuGet packages. And then we reinstalled the NuGet packages. And we fiddled with missing configuration details in the .csproj file. And behold, the TFS build spat out a green checkbox.

And after all that, the four of us were blinking at our machines (we were all gathered together using Lync [aka Skype for Business *rolling eyes*]) wondering, “What .. the actual .... uh what just happened? How did we get here? What is the answer to this NuGet mess?” And we all agreed: “There is no answer. NuGet is a nightmare, and you have to keep poking at it and fussing with it for an hour or two to get it to cooperate, if you didn’t do it right or know how to do it right to begin with.”

This was supposed to be a time-saver. It was supposed to make our lives easier than manually grabbing files off the third party web sites that provided them. Well I’m sorry, but after cataloguing our dependencies I think what took us two hours to troubleshoot a thing would have taken five minutes managing a lib directory, max. Sure, that’s about four minutes longer than working with the NuGet console, if every team member is consistent in how he uses NuGet. Get real!

Here’s the core issue I have with NuGet: it’s still third party. Microsoft has adopted and embraced NuGet, but MSBuild has absolutely no clue, zero, zilch, nada, no comprehension what the heck a NuGet package is. Everything is manually scripted, manually spoonfed, and these conventions with the .nuget folder and dropping a NuGet.exe in there and all this noisy config/setup crap is all workaround boilerplating that is dreadfully needing and pleading Microsoft to bake into Visual Studio, MSBuild, and TFS properly.

We had the same problem with MSDeploy. Who uses that, really? (I ask this in the same mind of, “Who uses Azure anyway?” Surely plenty but there are still many of us who don’t, yet we are still Microsoft stack developers.) MSDeploy and ClickOnce publishing is so painfully externalized black box and GUI-minded that for those of us actually trying to automate getting work done it’s easier to just write scripts. Really. In most cases it seems to be mandatory.

So Microsoft’s answer to the problem was to make the problem worse, by introducing native support for ‘bower’. Well, that’s not fair. They made the problem .. ehh .. more complicated. At least with ASP.NET 5 they no longer push client-side libs through NuGet. That fixes shifts that part of the problem to another equivalent yet completely different technology, one not maintained by the .NET community, but then again, it doesn’t need to since front-end web technology is vendor-neutral by necessity. But now we have to support ‘bower’, on top of NuGet. And what is the TFS story on this?! Oh that’s right, there is no Build process with ASP.NET 5, not really. We’re back to ASP.NET 1.1 web sites with mandatory dynamic generated code compilation. No more .csproj project manifests. Whatever’s in the file system is part of the project. The only difference here, other than gulp and bower via Node.js integration into ASP.NET where it feels like it doesn’t belong (sex with a strange cousin seven freaky generations removed?), is the new Roslyn compiler that makes performant compile-at-any-time behavior more, .. ehh, modern. But without a project manifest you now have very limited control of your project files and their behaviors. Welcome back ASP.NET 1.1 websites, we missed you. (Not.)

I’m sidetracked. This wasn’t supposed to be about ASP.NET 5, it was supposed to be about NuGet. I don’t know what the answer should be about NuGet, other than I think that if Microsoft is going to keep building upon NuGet for the development stack they need to get the convention-over-configuration notion working properly, because NuGet support here on ASP.NET MVC 5 projects with TFS CI build automation is a living configuration hell if not done carefully, sequentially.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Announcing Fast Koala, an alternative to Slow Cheetah

by Jon Davis 17. July 2015 19:47

So this is a quick FYI for teh blogrollz that I have recently been working on a little Visual Studio extension that will do for web apps what Slow Cheetah refused to do. It enables build-time transformations for both web apps and for Windows apps and classlibs. 

Here's the extension: https://visualstudiogallery.msdn.microsoft.com/7bc82ddf-e51b-4bb4-942f-d76526a922a0  

Here's the Github: https://github.com/stimpy77/FastKoala

Either link will explain more.


Powered by BlogEngine.NET
Theme by Mads Kristensen

About the author

Jon Davis (aka "stimpy77") has been a programmer, developer, and consultant for web and Windows software solutions professionally since 1997, with experience ranging from OS and hardware support to DHTML programming to IIS/ASP web apps to Java network programming to Visual Basic applications to C# desktop apps.
Software in all forms is also his sole hobby, whether playing PC games or tinkering with programming them. "I was playing Defender on the Commodore 64," he reminisces, "when I decided at the age of 12 or so that I want to be a computer programmer when I grow up."

Jon was previously employed as a senior .NET developer at a very well-known Internet services company whom you're more likely than not to have directly done business with. However, this blog and all of jondavis.net have no affiliation with, and are not representative of, his former employer in any way.

Contact Me 

Tag cloud


<<  August 2020  >>

View posts in large calendar