HN user

aksx

140 karma
Posts9
Comments75
View on HN

Maybe because other people search in different places. Events/Businesses: Google Maps, Instagram Trend/Tutorials: Tiktok, IG Reels News: Twitter/Social Media/News Outlet of choice

Google is for searching new sources of information and either it’s instant (google info box) or takes too long which makes a lasting memory about it being painful.

So many interesting findings in the post.

The tantivy binary search & rust binary search only has one different at the end, knowing the size of the slice ahead of time, right?

Could the rust compiler infer the size ahead of time?

Even if your current employer let's you talk about specific numbers, without context they don't tell the recruiter anything.

"The API latency was 10 seconds, now it's 8.5 seconds."

or

"I reduced the p99.9 latency from 1 sec to 400ms" (by removing input validation)

Capitalism is the way a system set of connections between subsystems and politics is a way to reorganize a system from within itself.

can the system still be simplified enough to grasp it well enough to change it?

That would be a model of a system not the system itself, and as George box said "All models are wrong, but some are useful"

where would an individual who has grasped it find the power to change anything?

If an individual is able to change connections between subsystems, they can change the behavior of the higher level system. But the impact of the change is dependent on the systems being changed.

I am all for the Go idiom that variable name length should be directly proportional to it's scope, the code samples in the post have take it a bit too far and make the code harder to read.

it would be so much more readable if the struct had more descriptive names

    type Cuckoo struct {
       buckets           []bucket
       numBuckets        uint
       entriesPerBucket  uint 
       fingerprintLength uint
       capacity          uint
    }
Thank You, Guido 7 years ago

Sometimes it's not about show how smart they are, developers aren't clear about the code they are writing.

when I write code for a concept i don't understand completely, it tends to be complex and cryptic. I'll go back to it after trying to understand the problem and the problem space more and be able to write simpler code.

Immigrant here, and I can read, write & speak english.

If i don't have a job with a company willing to sponsor my visa I would have to get back on the boat and leave.

My friends, who are from smaller countries have the privilege but I do not.

Stats from travel.state.gov

https://travel.state.gov/content/dam/visas/Statistics/Immigr...

    Waiting list size by country
    Country             Applicants
    Mexico              1,229,505
    Philippines         314,229
    India               298,571
    Vietnam             231,519
    China-mainland born 231,519
    Bangladesh          169,231
    Dominican Republic  146,160
    Pakistan            115,625
    Haiti               94,506
    El Salvador         64,868
    Cuba                55,847
    All Others          840,393
    Worldwide Total     3,791,973

This is a little silly.

Is it though? I interpreted question the following way.

"Rust is a tool in my tool box, when the reason for picking it over other tools isn't demonstrably true, what am i doing wrong?"

I agree with the rest of your comment, just not with calling the OP or their question silly.

The Server package contains the Register function. Main package implements the QueryUser function that does the work of querying the DB. When Main calls Server.Register to register the function with Server, it sends the function name (QueryUser) and..something else? Is that the memory address of QueryUser on my computer? And when Server actually runs the function, it's just pointing to QueryUser at the memory address given to it by Main?

This is correct, let me unpack this a little more.

The 'Register' function tells the server object that when a client tries to call the function "QueryUser" call the function passed as the second parameter and send back the result.

the client object's "CallRPC" functions tells the client object that i know that there is a function called "QueryUser" that the server know about and it has the same structure as the second parameter, when i call the second parameter, call the server with the arguments passed. The client object then creates a stub implementation which when called, creates a connection to the server, tell the server to call the function "QueryUser" with the given parameters, reads the results and returns the result.

The "Remote" part of RPC is done over the transport package which the main function is mostly unaware of.

Poor programmers are optimistic

completely agreed, just had a long conversation with a junior engineer about how adding a cache would not solve a complex architectural problem and just add more complexity.

All those are indicators of coupling unrelated ideas together.

once useful tool i have found is using automated tools to spot indicators like these. In java using checkstyles cyclomatic complexity checks and class fan out is a strong indicator (not proof though).

The best parts of rust's error handling are the try!() macro (aka `?`),

Go's way of providing try!() macro is less magical but almost as useful.[1]

From/Into error types allow the compiler to wrap types or convert between error types

error is an interface in Go which can be easily cast/checked for the underlying type.

Go's error handling is pretty primitive

I wouldn't call it primitive, I would call it simple. I like the comparison i read on a blog on HN.

Rust is the 'new' C++ and Go is the new C

[1] https://blog.golang.org/errors-are-values

They are important in Haskell because they allow "real world" tasks to performed and give the ability to reason about functions.

They are _useful_ for non-pure function programmers because it's a tool in the tool box which can allow them to write composable code that can be reasoned about.

Java's & C++'s Optionals are monads, Rust's Result<T, E> is a monad, etc.

that's a good generalization but has one small thing missing.

The main benefit of a monad is composition. It allows a programmer to chain computation and put some logic in the chaining. It's the difference between

    f(g(h(x)))
and
    h(x).then(g).then(f)
the '.then' method has some inbuilt logic, for to ability to add that logic we 'embellish' the return type of h (or put it in a container like Promise<>).

To equate it to java's Optionals, the flatMap is a good example, it takes an optional and applies some logic and decides to call the second function.

valgrind had a bunch of stuff like massif, callgrind and memcheck but none of them (AFAIK) tell you how long a function call took, and point out the area of code taking too much time, which perf does.