How to Build Modern Software with all the Kubernutes?
-
I want to greenfield a simple application using the most modern approach possible. Help me out?
Keep in mind, however, that my tech mind is frozen in 2010. That may as well be punchcard-based stone tablets, and I'm to a point where I don't even understand what I'm supposed to understand about modern software stacks. It's a lot like Modern Art (which I also don't understand), an I'm hoping the Very Smart People here can guide a knuckle-dragger like me.
So first, we start with code. Git is involved, but not just as a place for the source code. What other stuff?
I'm not even sure what code to write. One language? I think it starts with JavaScript and ends with a fully-embedded browser as an Electron app?
Testing. Obviously we need it, and I heard about Kucumber, but that's probably ancient technology.
The next part I sort of get. It's Dicker. And then Kubernutes. And then Helm. But what's the next layer on top?
And then finally, how do we notify the cantankerous guy sitting at some Linux command line, typing all these commands, that we want our application deployed to production? Is it on Slack? Is he a slack bot?
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
I think it starts with JavaScript and ends with a fully-embedded browser as an Electron app?
:please_do_not.js:
-
The last greenfield Web application I did by myself was in 2015, using ASP.NET Webforms. That application is still in use.
A couple years later, a coworker and I developed a greenfield Web application using ASP.NET Webforms, Entity Framework and I'm sure some JS libraries somewhere, but don't recall exactly which as my coworker handled most of the front-end stuff. That application is still in use, somewhat, but that's mostly on the customer's dithering and intransigence (causing a golden market opportunity to nearly dry up) rather than our failings.
People keep telling me that Webforms is going away and that ASP.NET Marvel vs. Capcom is the way to go, and that Angular is pretty cool, but I have yet to see a value proposition as to why they're better.
Disclaimer: If you've been following my toolchain upgrade thread, I'm also developing a game in C++ with a custom engine composed of some dependencies that haven't been updated since 2013 or 2014, so keep that in mind when evaluating my recommendations.
-
@Groaner said in How to Build Modern Software with all the Kubernutes?:
ASP.NET Marvel vs. Capcom
+⍌
-
@apapadimoulis The most modern approach? That's a bit ambiguous.
I'd say, go with ASP.NET and Knockout. This gets you a UI with bindings, like WPF. I think C# makes it stupid easy to serialize plain old data objects, so most of what you need to write is business logic. Plugins and stuff can help you write widgets and add behavior and stuff.
Or A Node.js stack and maybe AngularJS. Same idea.
If you want to try something interesting, try Haskell's Yesod with Knockout.
-
Throwing 'Rust (Rocket) backend with a frontend powered by WebAssembly which is also Rust' into the ring.
-
@Groaner said in How to Build Modern Software with all the Kubernutes?:
People keep telling me that Webforms is going away and that ASP.NET Marvel vs. Capcom is the way to go, and that Angular is pretty cool, but I have yet to see a value proposition as to why they're better.
- Easier to understand (no arcane page lifecycle - each request corresponds to exactly one controller method; async/await are as simple as decorating the relevant action)
- Smaller requests (better performance - no worries about ending up with megabytes of viewstate)
- Dependency injection (partially supported in Web Forms since April 2018, but some components like ASMX services are still unsupported) - benefit both for testing, and for some inheritance scenarios
- Supports inheritance without changing presentation code (can make controller changes without needing to change the CSHTML/ASPX)
Some of those may be specific to our environment but it’s done a great job of minimizing the amount of customization needed for each client.
That said, ASP.NET Core, as a framework, doesn’t offer much over MVC. (Injectable attributes would be nice.) Increased performance would be the main reason to do that.
-
@apapadimoulis it is a moot point. What was the pinnacle of technology when you wrote your post will be deprecated for something even dumber by the time the first reply was posted.
No one really writes software anymore. Most of them just learn new technologies that are abandoned before they even learn what they do. Lather, rinse, repeat.
-
@Unperverted-Vixen said in How to Build Modern Software with all the Kubernutes?:
- Easier to understand (no arcane page lifecycle - each request corresponds to exactly one controller method; async/await are as simple as decorating the relevant action)
Dealing with arcane frameworks is a fact of life when it comes to software development, and the page lifecycle is pretty simple once you get the hang of it. But I will give you that callbacks can be a pain in the ass (e.g. having to use
Session
to keep track of dynamically-added controls in an update panel, etc.).- Smaller requests (better performance - no worries about ending up with megabytes of viewstate)
Viewstate is there for a reason. HTTP is not stateful. Viewstate can also be disabled if the developer accepts the tradeoffs. I see such a compromise as like implementing a reliability layer on top of UDP - something that has valid use cases, but shouldn't be the immediate solution.
- Dependency injection (partially supported in Web Forms since April 2018, but some components like ASMX services are still unsupported) - benefit both for testing, and for some inheritance scenarios
If desired, a separate business layer allows for automated testing of the core functionality (and code reuse in other modules). Testing the UI is trickier, and something I don't have an easy solution for apart from a QA guy kicking the issue back to the developer because the button doesn't work.
- Supports inheritance without changing presentation code (can make controller changes without needing to change the CSHTML/ASPX)
In the past 11 years, I haven't felt the need to inherit from a webpage.
I've heard similar arguments about why
<table>
s are bad, but they're pretty darn reliable compared tofloat: left
,inline
and their ilk if you're trying to get two things positioned next to each other. In the past 11 years, I haven't been in a situation where I wished I could rapidly change the guts of a page where I wasn't already doing a major revision.Some of those may be specific to our environment but it’s done a great job of minimizing the amount of customization needed for each client.
Definitely. In a previous life, there was a fair amount of customization work, but these days many of the applications I work on serve a single customer. I look at a few of our projects that are littered with
SqlDataSource
s in lieu of a proper business layer, and am at peace with it for the most part, as we generally use stored procedures everywhere, and there's amazingly little code duplication.That said, ASP.NET Core, as a framework, doesn’t offer much over MVC. (Injectable attributes would be nice.) Increased performance would be the main reason to do that.
There seems to be a lot of FUD on the Internets about how ASP.NET is horrible for performance, and arguments invoked about how none of the Alexa top N sites use it. That may be, but is that a concern for a small shop that serves a handful of customers and may only have a few hundreds or few tens of concurrent users?
-
@Captain said in How to Build Modern Software with all the Kubernutes?:
I'd say, go with ASP.NET and Knockout.
Sorry grandpa, we're in the modern age now. I don't see how we're gonna get a team of 50 bay area brogrammers to innovate on a stack like that.
-
@Polygeekery said in How to Build Modern Software with all the Kubernutes?:
No one really writes software anymore. Most of them just learn new technologies that are abandoned before they even learn what they do. Lather, rinse, repeat.
This explains a lot. Pen and paper are my new go-to productivity tools. They are absolutely amazing, and I can't believe how much time I wasted trying to use software.
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Sorry grandpa, we're in the modern age now. I don't see how we're gonna get a team of 50 bay area brogrammers to innovate on a stack like that.
Oh, then definitely go for Miso https://github.com/dmjio/miso
-
@Captain said in How to Build Modern Software with all the Kubernutes?:
definitely go for Miso
OH MY GOD THIS IS IT.
☑ requires Haskell, which no one uses, and thus only I will be only one who can build and maintain it
☑ enumerates completely incomprehensible benefits that I don't understand, but I can use to call people an idiot if they question me on my choice
☑ will allow me to spend far more time playing around and ideally fixing bugs in their framework so I don't have to deliver business value
Should I be concerned that this uses a bowl of RAMEN as the logo, yet is called MISO? Nahhh... that level of correctness is several abstraction levels above me
-
-
@apapadimoulis FWIW, those requirements are also fulfilled by a full-Rust stack.
Also I'm starting to get a picture of the use case.
-
@pie_flavor sorry, I didn't mean to discount your suggestion of Rust. That too is an incomprehensible solution in search of a problem, and it's also built by Very Smart People.
I've heard that NPMJS.ORG uses Rust for parts, because the NodeJS they wrote was too slow, even for the massive supercomputer cluster they require to run a package gallery.
Is there not a way we can use both? Don't worry about creating lots of runtime dependencies. We have Dicker for that.
-
papadop must be bored.
Hey where's my mug and sticker?
-
@apapadimoulis Well, mixing two languages in the backend wouldn't really be feasible, but remember the possibility of WebAssembly. Both Haskell and Rust compile to wasm, although Haskell's is very difficult to make work and Rust's isn't. I'm sure that will help you make the choice but I'm not sure which one you'll make based on it. If you pick Rust for the backend, then the framework you're looking for is https://rocket.rs. Rust wasm tutorial can be found here and this is probably the only Haskell wasm compiler.
If you use Haskell for the backend you're probably not getting to use Rust since Miso seems to be full-stack if I'm reading it correctly. Also FWIW I've used Rocket before and not only is it incomprehensible, it's also very fun. Bonus points if you can incorporate it with diesel.rs without throwing up your hands and writing the SQL yourself.
-
@Captain said in How to Build Modern Software with all the Kubernutes?:
papadop must be bored.
It's true, sometimes I have to leave my world of paper and pen.
Hey where's my mug and sticker?
I'll make you a deal. Try out my software, tell me how great it is (or don't hurt my feelings when telling me how bad it is), and I will send you a mug.
Maybe Ishould do bonus stickers too...
-
@apapadimoulis maybe you should fix the link too.
-
@pie_flavor said in How to Build Modern Software with all the Kubernutes?:
fix the link too
nah ... broken links on your page are soooo 90ties
-
@pie_flavor said in How to Build Modern Software with all the Kubernutes?:
If you use Haskell for the backend you're probably not getting to use Rust since Miso seems to be full-stack if I'm reading it correctly.
No no no, we divide and conquer. We build the messaging stack in Rust (for fast), then use Miso for web stack (for responsiveness). This is more scalable. Then we use RESTFUL web services that use YAML to communicate.
This is all where Kubernutes comes in. It simplifies the multiple stacks into one great pile of application.
Also FWIW I've used Rocket before and not only is it incomprehensible, it's also very fun. Bonus points if you can incorporate it with diesel.rs without throwing up your hands and writing the SQL yourself.
I don't do SQL. I do code that generates SQL.
-
@pie_flavor said in How to Build Modern Software with all the Kubernutes?:
@apapadimoulis maybe you should fix the link too.
Hey now there were 5 out of 6 working links in that article. Pretty good by modern software standards.
The important part was, I got the community to identify a bug and then fixed it.
Just need to get a way to shame you into submitting a pull request to fix it yourself, and thank me for the opportunity.
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Just need to get a way to shame you into submitting a pull request to fix it yourself, and thank me for the opportunity.
Maybe he'll do it for a free mug
-
@apapadimoulis Please put the articles on a public repo so I can fix all the typos
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
I'll make you a deal. Try out my software, tell me how great it is (or don't hurt my feelings when telling me how bad it is), and I will send you a mug.
Frist?
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Should I be concerned that this uses a bowl of RAMEN as the logo, yet is called MISO?
Given that they're not mutually exclusive, and in fact miso is usually used in ramen recipes[citation needed], I don't see why you should.
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Then we use RESTFUL web services that use YAML to communicate.
God. What happened to OMGWTF? There's so much more room for horrible things these days; eventually someone will have a bright idea like Docker monads.
-
@Zecc ahhhh yes, this level of pedantry is why it's the perfect framework
More technically miso is in one of the four types of ramen, but that's like calling it "soy sauce" and having a picture of ramen. It makes sense in the same way this framework makes sense.
-
This post is deleted!
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Try out my software
Somehow
inedo.com
is on our DNSBLI do need a new mug though, this one has been plain white now for years
Edit: it's listed on hpHosts's Ad Server blocklist
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
I don't see how we're gonna get a team of 50 bay area brogrammers to innovate on a stack like that.
Sounds like an advantage to me!
-
@pie_flavor said in How to Build Modern Software with all the Kubernutes?:
eventually someone will have a bright idea like Docker monads
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
@Polygeekery said in How to Build Modern Software with all the Kubernutes?:
No one really writes software anymore. Most of them just learn new technologies that are abandoned before they even learn what they do. Lather, rinse, repeat.
This explains a lot. Pen and paper are my new go-to productivity tools.
They're my go-to technology for creating modern web apps, too!
-
Ok, but then it dumps me back to the install screen. Where is the SQL installer it just spent half an hour downloading?
Edit: Found it in %temp%, the install log is very helpful:
ScenarioEngine.exe returned exit code: 0x84BE0BC2
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
I just noticed this page has a link to what I can only assume is tonight's coming, currently-unpublished article. I suppose it's not particularly surprising that the Daily WTF site would have its own like that.
Now I can (1) perhaps shut down before it's properly published yet still read it; (2) easily guarantee a "frist"
-
When retrying a failed install:
Obviously I need to change the selection to 'I already have a key' and get that key from my.inedo. But a
HTTP 500
isn't user friendly at all, andif I hadn't already logged in to my.inedo I wouldn't know it displays the key there.I guess that bit is fine, it tells you go there and if you did then you'd see the key, 'try again' aint gonna help thoughEdit:
Eww, use the Hub logo for the installer icon, that's nasty.
-
@Cursorkeys and then there's this:
@apapadimoulis, isn't this a problem with your (Inedo's) extension?
-
Now stuck, Hub installer can't install SQL 2016 and
specify instance
doesn't see any instance I create manually:
-
@kt_ said in How to Build Modern Software with all the Kubernutes?:
@apapadimoulis, isn't this a problem with your (Inedo's) extension?
Hmm yeah, I wonder if it's a localization issue?? What's your locale?
Like, I'm thinking VSTest is generating numbers in one locale, and int.Parse (or whatever) is parsing them in a different. I don't know.
UPDAT: nevermind, it's clearly a locale issue based on the "0,000" seconds formatting. I've asked John to fix it asap in the extension.
-
@Cursorkeys said in How to Build Modern Software with all the Kubernutes?:
Now stuck, Hub installer can't install SQL 2016 and
specify instance
doesn't see any instance I create manually:Ugh; yeah SQL 2016 is a pain. It's followed the trend of getting progressively worse than SQL 2005, but not so many practical options.
Anyways, I don't have a good answer for why SQL didn't install or why it can't detect instance. My guess is, SQL Server Service isn't running??
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Anyways, I don't have a good answer for why SQL didn't install or why it can't detect instance.
Think I've worked out what the error actually is:
Good job Microsoft
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
My guess is, SQL Server Service isn't running?
About 5 Express ones running locally, mostly 2005 but there's a 2012 and a 2014 in there too. The one I just spun up for it was another 2014 named instance. There's a full-fat SQL 2005 server on the local network too. Will it only show 2016 instances maybe?
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Hmm yeah, I wonder if it's a localization issue?? What's your locale?
Ah, I see some things never change. Unfortunately they're precisely the things we'd very much like if they did.
-
@Applied-Mediocrity Typo on their own company name. Nice.
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
@kt_ said in How to Build Modern Software with all the Kubernutes?:
@apapadimoulis, isn't this a problem with your (Inedo's) extension?
Hmm yeah, I wonder if it's a localization issue?? What's your locale?
Like, I'm thinking VSTest is generating numbers in one locale, and int.Parse (or whatever) is parsing them in a different. I don't know.
UPDAT: nevermind, it's clearly a locale issue based on the "0,000" seconds formatting. I've asked John to fix it asap in the extension.
Yeah, that's what I figured.
My locale's pl_PL.
I actually simply disabled this step and just marched on. ;)
-
@kazitor said in How to Build Modern Software with all the Kubernutes?:
@apapadimoulis Please put the articles on a public repo so I can fix all the typos
Yes. I too would like all the articles in a public repo. So I can fix typos.
-
This post is deleted!
-
@Groaner said in How to Build Modern Software with all the Kubernutes?:
But I will give you that callbacks can be a pain in the ass (e.g. having to use Session to keep track of dynamically-added controls in an update panel, etc.).
Just recreate the controls OnInit, using the same IDs.
@Groaner said in How to Build Modern Software with all the Kubernutes?:
Viewstate is there for a reason. HTTP is not stateful. Viewstate can also be disabled if the developer accepts the tradeoffs. I see such a compromise as like implementing a reliability layer on top of UDP - something that has valid use cases, but shouldn't be the immediate solution.
Yes it is there for a reason, but not the one you say. The best thing ViewState does is effectively "sign" the page so illicit content can't be injected-- and prevents CSRF.
If your ViewState is getting too big, implement any one of the many server-side viewstate solutions. (Saves the viewstate to the server identified with a GUID, replaces ViewState variable with that GUID, on postback regenerates the ViewState from disk using that GUID)
@Groaner said in How to Build Modern Software with all the Kubernutes?:
In the past 11 years, I haven't felt the need to inherit from a webpage.
I've inherited from UserControls many times. There's usually a bunch of stuff I want a UserControl to do automagically, so I make a BaseUserControl, put stuff I need into properties and PageLoad, etc-- then have my web controls inherit from it.
@Groaner said in How to Build Modern Software with all the Kubernutes?:
I haven't been in a situation where I wished I could rapidly change the guts of a page where I wasn't already doing a major revision.
Responsive design for mobile-- though that in itself is a major revision. Need to do Floating Div Fuckery to make shit go side-by-side on desktop, then top-to-bottom on mobile.
-
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Kucumber
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Dicker
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Kubernutes
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Helm
I literally cannot tell if any of those are real or fake.
-
@Lorne-Kates said in How to Build Modern Software with all the Kubernutes?:
@apapadimoulis said in How to Build Modern Software with all the Kubernutes?:
Dicker
I literally cannot tell if any of those are real or fake.
Dicker is pretty much like Docker, except it automatically grows when you start using it