[0] https://www.adafruit.com/product/1497
1,446 karma · joined November 17, 2011
You can reach me at jon [at] dontbreakthebuild [dot] com
[0] https://github.com/jhartwell/plsm
[0] https://www.adafruit.com/product/1497
"There must be some pretty large moats in this industry because most shops are clearly not competing on competence or customer service."
There is. It is a capital intensive business that has licensing requirements for every state that you do business in. There are mortgage companies that will loan you the money and then turn around and sell that loan to an investor who would then service the loan. There are also mortgage companies that will loan you the money and also service the loan for its entire lifetime. In the case of the former, you can make your money back relatively quickly as you should be trying to sell the loan to an investor around the time of closing but there is risk in doing so. If you haven't done your due diligence about the borrower and something negative about the borrower comes to light (such as borrower lying about income) then the company that is buying the loan can pull out and now you are on the hook for a large loan that you issued to somebody who may not be qualified. With the latter, your income is going to be slow at first since you would only be making money from monthly payments.
[0] https://en.wikipedia.org/wiki/Ukraine_power_grid_hack
[1] https://www.nbcnews.com/news/us-news/iranian-hackers-claim-c...
My mom still has a flip phone and does not want to get a smartphone at all. Not everybody has the desire to have a flip phone. They would not be able to look at the menu in any meaningful way.
Many of the restaurants I've seen with QR codes for menus have the QR as a sticker on the table. It isn't hard for somebody to create a QR that leads to a malicious site and just place those on top of the existing QR codes.
My technique for debugging with Clojure + emacs was to use a bunch of print statements and then also using a repl to try and duplicate the issues or at least see what was going on. Less than a month ago I started using the CIDER debugger inside emacs and have been happy with it overall. There are some issues I have had, namely that you can't set breakpoints in macros which is understandable. I have gotten around that by creating a temporary function and move all the code into that function. The main use case I have for doing that is when trying to debug Compojure routes, which are defined in macros.
From my experience, there are companies that will take in people who they feel are good hires and then will train them in the language that they use but they are few and far between. From what I've seen, those companies typically have their own internal recruiters. The biggest factor that could help and is under your control is to have some sort of project(s) available for people to see in the language(s) that you are targeting.
One of the benefits of this architecture for us is the ability to easily share information between services. We utilize SNS and SQS for a pub/sub architecture so if we need to expose more information we can just publish another type of message to the topic or if we need to consume some information then we can just listen to the relevant topic.
There are two big issues that I've run into while at this company. One is tracking down where events are coming from can be a big pain, especially as we are replacing services but keeping message formats the same. The other big issue is setting up lower environments (dev,qa,etc) can be difficult because you pretty much need the entire ecosystem in order for the environment to be usable, which requires buy-in from all teams in the organization
Another thing I did with org mode was create a release document of all commits that are going into a release as well as the link to that commit in github, then exported to PDF and sent to the team. We had to cherry pick a bunch of commits for a release and in order to make it clear what was going out I organized it by newest to oldest and had the commit hash as a hyperlink.
Last year I worked on a project and because of my mistakes it looked like we weren't going to hit our deadlines. I did not want others to have to suffer because of my mistakes so I made sure to work late (some days as late as 1AM) to make sure that our deadline was hit. Nobody asked me to do that but I didn't want others to suffer. We didn't hit our deadline but weren't too far off and people were overall ok with the situation as we were just headed into beta for the internal users. I'm pulled off that project and put on a new project, which is to work on something that literally made my previous months of effort obsolete. It was the project to completely replace the application that I worked extra on. Fast forward a few months and I am given a project that had a super aggressive timeline, which I didn't think could happen and I was told my estimate wouldn't be communicated out and I worded my estimate poorly thinking I covered my ass when I didn't and my estimate was communicated out. I was pressured hard to work nights but I pushed back and then I got to a point where I relied on another team and I couldn't get any further without them. It turns out nobody had actually verified that the other team had the functionality we needed (it was critical to what I was working on) and the other team hadn't even started working on the functionality that we needed. That was the straw that broke the camel's back, especially since they were wanting me to work the weekend before I brought up the fact that we don't have the pre-reqs even done and nobody from management actually verified we were ready to start. Since then I have pushed back on all attempts to get me to work late hours. I have seen mismanagement from terrible timelines to straight out lying to business people about things that are done when the work hasn't even started. Nothing changes if everybody keeps working late to hit crazy deadlines and management isn't affected at all if we do hit the deadlines as they aren't the ones taking time away from their personal life.
I have worked late a few times since that incident but it was because I lost track of time working because I was just so focused or because the delay was completely on me and I wanted to fix it so others downstream weren't affected
- Arena Analytics: https://arena.io/
- Reify Health: https://www.reifyhealth.com/
- Guaranteed Rate: https://www.rate.com/
- OppLoans: https://www.opploans.com/
- LookingGlass Cyber Solutions: https://lookingglasscyber.com/
I also believe that DRW (https://drw.com/) also use Clojure but not 100% sure on that. I know they use some Elixir though.
filter takes a predicate and a collection and will return a lazy sequence of all items that the predicate returns logically true. For example:
(filter odd? [1 2 3 4])
would return a lazy sequence of (1 3)keep is a function that I was unaware of (and most of my team was too) until I was turned on to it by a former coworker. keep takes a function and a collection and returns a lazy sequence of non-nil results. For instance, if I have a collection of maps and I want to only get a value of a specific key I could do the following with map and remove
(def items [{:v "hi"} {:v "there"} {:m "not v"}])
(remove nil? (map :v items))
What the map does is get the key `v` from each map in the collection and we end up with a sequence that looks like `("hi" "there" nil)` Since the last map in the collection `items` does not have a key `v` the value will return nil. We would then need to use the remove function with the nil? predicate which will remove all items in the collection that are nil. If we use keep, though, we could do this in one pass. (def items [{:v "hi"} {:v "there"} {:m "not v"}])
(keep :v items)
Because keep already removes nil for us we end up with `("hi" "there")` cond-> and cond->> which takes an expression and then threads it through test/form pairs without short circuiting by stopping on the first test that returns true. I have used this a lot when conditionally adding to maps. Something like this:
(let [base-map {:id "123"}
name (function-that-could-return-nil)
address (another-function-that-could-return-nil)]
(cond-> base-map
(some? name) (assoc :name name)
(some? address) (assoc :address address)))
If name and address are nil then I will still have the base-map.
I also use some-> and some->> a lot as well. some-> and some->> operate similar to -> and ->> respectively but the difference is that there is a nil check before subsequent form. It will prevent nil results to keep being passed and can help alleviate NullPointerExceptions.
As for maps, I recommend adding assoc-in, dissoc, update and update-in. assoc-in allows adding nesting to a map. I could do (assoc-in {} [:base :value] "test") which would result in a map that looks like {:base {:value "test"}}. dissoc removes a key from a map. update allows you to "update" a map by passing a key and function where the function has an argument that is the old argument. An example of that is (update {:name "James" :age 26} :age inc) which will increase the value of :age by 1. update-in allows you to do the same as update but in a nested structureHobbyist/toy project - sure, using shadow-cljs you can do your front end entirely in ClojureScript and make calls out to whatever backend you want
Professional project with ClojureScript backend - sure, you can use shadow-cljs to target both node (using :node target) and the browser which will allow you to utilize ClojureScript for full stack and not have to rely on Clojure
Professional Project with non-clojure(script) backend - no. It would not be worth it to spend resources to learn clojurescript (talent pool of existing clojure devs is small) and not taking advantage of full stack clojure(script) can be detrimental
> Clojure sounds like the choice to avoid because of the JVM
The JVM is most definitely a big reason you SHOULD choose Clojure over CL in my eyes. It allows access to a vast selection of existing libraries.
I'm not sure what sorts of projects you would want to do with the new language but if you plan to do web development (or mobile dev with React Native or desktop with Electron) with your choice of Lisp then Clojure allows you to do that with ClojureScript.