How many lines of code is Candy Japan?
candyjapan.com
candyjapan.com
Anyone else notice this?
I think I can do a lot better than that now that I'm using Scala. Certainly I don't feel like I've hit the limit yet.
Types are awesome. Languages like Rust give them to me without having to learn a ton of theory. However, eventually, I realise that my types have boxed me into a certain design - and I need to refactor heavily, which involves rewriting a large chunk of my types which I was relying on to show me that my code was correct.
Functionality testing will tell you when you've failed to encode an invariant in your type, and there's a good chance that the reason you failed to is just that it's more effort than it's worth. Else we'd all be writing proofs for every program in Coq.
In practice, as I alluded to in my previous post, you really want types combined with broad functionality testing across a range of scenarios. You really don't want to be relying on "it compiles, I assume it works" unless you're able to back out of a deployment in seconds when it doesn't.
Some things are probably not worth typing, but if they're not worth typing they're not worth testing either. Whatever your target defect rate, the most efficient way to hit that target is using types.
Sure there is. Stop testing random bits of internal functionality, start testing huge modules with well-known (semi-public) APIs, or your entire program, and combine that with a ~reasonable~ type system. You want full-system testing. You don't need a whole lot of tests to be sure "it's basically working", and it's a lot easier to turn repeatable bug reports into tests.
When you inevitably break a piece of functionality despite your types, you might not know precisely how it broke, but at least you know it's broken without a customer calling you up. And every time a customer does call you up, you can add a full-functionality test - "this is what the user did, and this is what I expect from that".
Every other engineering branch backs up good practices and solid math with lots of testing. So should we, types or no types.
https://spin.atomicobject.com/2014/12/09/typed-language-tdd-... makes the case that many tests can be replaced more effectively by types (though the use of Java makes the point less clear than it should be, and means that some properties are so difficult to express through types that the author prefers to use tests). That one can prove correctness with types is well-known, and it stands to reason that there is no need for tests for formally verified code. These two things together suggest that there's never a point on the defect rate/cost curve that's easier to reach with tests than with types, but they don't rule it out entirely.
How would you verify the correctness of this function with types alone:
Integer add(Integer a, Integer b) { return a + b; }
How would types verify for me that the result is correct and not a+b+1?
Formal proofs work for this but to make them work you need more than just types.
That sounds like a joke but it's what going overboard with dependently typed programming languages is like.
model.setTitle( dto.getDescription() );getDescription simply needs to return a Description object while getTitle returns a Title object. Duh.
Only in the final rendering should it get turned into a string and there it should only accept a Title type for doing so.
Okay, I'm kind of joking, but this is seriously the solution if you really want to get down to it - primitive overuse is the problem, so wrap it in a type that makes it explicit. You need cheap and easy types to take full advantage of this sort of thing.
EDIT: And even with those reading code developed in such a way may go overboard at some point. I'm not sure as I haven't really seen it done to the fullest extent possible. Typically even when taking a fairly strong advantage of such a type system, unit tests and stuff are still used, but theoretically you could enforce their parameters entirely in the type system. Of course, that enforcement can also be incorrect, but it does make it clearer in many cases.
How does static typing ensure you're mapping the correct JSON input fields to your custom types?
Ideally you push it all the way out. Rather than JSON you use Thrift or similar where the messages are strongly typed.
But if you do use JSON, how much benefit does unit testing your JSON mapping really give you? The mapping in code is just a list of field:field pairs, the test is just the same thing, is there really any value in repeating it twice? I'd sooner rely on careful code review than a test.
The project I'm working in atm is neatly structured and at ±60K, but you definitely see certain team members knowing more about one part than the other. We've also started a POC to start moving to Typescript for the more critical areas of the application (services, data models).
I haven't had enough chance to do it, but I'm at least intrigued.
Refactoring Ruby is painful in a large project, even with decent test coverage (and a large portion of the tests basically enforce what you'd get automatically with static typing). C++ is doable in that you'll get (increasingly humane with clang and recent GCCs) compiler errors when you've forgotten some detail. But refactoring Java is positively germane with all of the tools that are enabled by such a consistent VM-model. (It really is neat to be able to rename a method in an object on 100k LOC project simply by renaming it in one place or to change a signature with helpers along the way.)
Some of that makes those languages less fun (and quick) to work with initially, but for projects that are likely to eventually grow quite large, there can be an eventual pay-off.
We're not missing static typing as far as I know. We still are able to ship a lot of changes every month. I'm not sure if it is our structure (idiomatic Rails), test coverage (over 85%), something else, or maybe we should miss it but don't realize it.
One disadvantage is that static typing causes more lines of code than dynamic code. And code size is the best predictor of code quality http://blog.vivekhaldar.com/post/10669678292/size-is-the-bes...
Not if the statically typed language uses inference.
Those EAN13 codes you are printing are US only and probably reserved. I recommend that you change to any one of the in-store codes like 2*. It specifically carries no restrictions.
The video had some closing points, including "NoSQL sucks for reports", which was explained briefly. OP, if you could, I would like for you to elaborate a bit more on this point. I am not doubting that it's true for Google App Engine, just interested to hear about the particulars.
For a reporting system you want an ad-hoc query language, fast in-database aggregation, and joins.
The GAE datastore has none of the three, and MongoDB lacks joins. These are not fatal flaws - the GAE datastore has other advantages like infinite scalability, built-in synchronous geographic replication, failover, zero maintenance, etc. But for analytics, we replicate a subset of data to Postgres. It's still cheaper to have developers write occasional replication code than to hire a DBA to maintain the database, and I never have to worry that an ill-conceived sql statement will create an incident. I've come to the conclusion that using the GAE datastore as primary datastore and replicating to specialized databases is a pretty good architecture for systems that require reliability and low-maintenance.
MongoDB's aggregation framework is really painful because the query language is weird and very low-level - you have to do most query planning yourself. And without joins you hit the limits of the kinds of questions you can ask the system very quickly.
FWIW, my guess was 10k lines of code.
I didn't listen to the talk, so I don't know if he mentions it there as well, and you are looking for a more in-depth explanation.
I was impressed by the precision in the data, i.e. being able to tell exactly how many lines of code deal with "fraud detection". Perhaps there's a "frauddetection.py" file, but then there has to be someone importing it and using it, and those lines are harder to count, I'd expect. But perhaps the integrations are small enough to deal with manually.
Google cloud now has cloud sql, which would likely be much better. But then he needs to code, test, and migrate.. perhaps not worth it?
https://recurly.com/press/recurly-teams-up-with-kount-to-hel... https://docs.recurly.com/docs/kount
You get some basic protections for free but you can also integrate with your Kount account if you want to customize.
"I don't know how I could have expect it, but somehow from the start I should have prepared for fraud. You want to at least keep an on any suspicious activity and react quickly if you start getting many chargebacks."
'expected' and 'at least keep an eye on'
EDIT: I don't know why I am getting downvoted. I am NOT from embedd.io (why else would you downvote otherwise?) and just genuinely discovered the service. HN is truly toxic lately.
Clearly, you're incorrect, because several people have explicitly stated that they appreciated the mention of this site (and probably there are more who were glad to find out but didn't comment). `bemmu`, Candy Japan's founder, also positively responded to the comment in question.
In my opinion, downvotes on HN should be reserved for malicious comments like trolls, ad hominems, off-topic spam (real spam, rare on HN thanks to the mods. not just "I don't like this comment and think it's off-topic"), factually incorrect comments, and "reddit style" humor.
Users should not downvote comments they simply disagree with, on-topic promotional comments, and tangentially related comments. Tangents are a great way to discover new ideas.
However, there is a small cadre of HN downvoters who disagree with me, and who rabidly downvote any comment with a whiff of being off-topic or controversial. These downvoters must spend lots of time on HN, since their downvotes always come very quickly after a comment is submitted.
Luckily, they do not represent the majority of HNers who can downvote, since comments like this one typically crawl back up into positive territory after the first 30-60 minutes. Some of my comments that were initially downvoted for being "off-topic" even crawled back up to over 10 upvotes.
To the GP commenter, please don't get too frustrated. It's a relatively small number of people who downvote useful comments like yours. It's true that they are among the first to vote on comments, but almost always their downvotes are reversed after some time.
People whining about down votes and then complaining about it only makes the discussions worse. Your comment is going to be seen by maybe .1% of HN. There are better avenues to raise this issues.
If you want to change how down votes are handled going off topic in a discussion is not how you do it.
If you are complaining about down votes you are polluting the discussion even more than the erroneous down votes themselves.
People are people. It takes more to change behavior than complaints.
If that's the case, then both you and I are pissing into the wind here.
> If you are complaining about down votes you are polluting the discussion even more than the erroneous down votes themselves.
What about complaining about complaints about downvotes? Does that pollute the discussion or is it exempt?
There are established norms that downvoting is not just for the cases you mentioned: https://news.ycombinator.com/item?id=117171.
I'm not going to sit here through the fifteenth iteration of BSD v GPL even if the arguments are cogent and civil.
> I'm not going to sit here through the fifteenth iteration of BSD v GPL even if the arguments are cogent and civil.
No, you're carefully going to read them (to make sure they're "enough of a waste of my time") and then downvote them, because it's clearly a great way to spend your precious time.Yes.
The site founders have explicitly stated that downvoting to disagree is fine. There is also the 'flag' mechanism for toxic comments.
But does it really need it's own thread?
I don't think it's really out of topic. People linked to the blogpost. The service in question is used on the blogpost.
We are a technical bunch. It make sense to comment on the technologies used in a link rather than only its content.
Exemple: candyjapan has this nice comment at the top of their pages sourcecode.
"Hi, Thanks for reading the source. If you would like to start your own subscription box, buy my book! https://www.candyjapan.com/book It contains information that will honestly be useful to you, such as different platforms for running box sites like these and even some sample marketing campaigns."
It's only mildly interesting, so you don't create a thread but make a comment about it. It's still relevant to the discussion because the link was to the website. It is however irrelevant to the content of the article that was linked, but that shouldn't matter.
As for the downvotes, don't mind them. It's not "karma" like in Reddit. There is no hunt for points here! People downvote based on redevance.