Sat, 28 Oct 2017

It's Time for a Trusted Social Network

One of the reasons that Google has become the predominant search engine is their discovery and application of "PageRank" to search results. Google determines which search results are most relevant, in part, by examining hyperlinks in web pages.

The idea goes, if something is linked to, it implies trust. The more people who link to you, the more trust you must have, so links that you make to others have more value than other pages who don't have as many trusted links.

If that hurts your head a little, it should, because it's a recursive algorithm that constantly needs to be recomputed.

The problem with Facebook and most other social networks, is that they haven't applied the learnings from PageRank to their social networks. The news and information that gets surfaced shouldn't be based on what you most like, it shouldn't be based on ad revenue, or on other social network signals that are easy to fake.

Ebay has had a similar system for their sellers. To become trusted, you have to complete transactions that people say were legitimate. Uber and Lyft have it for their drivers (and riders). Facebook merely needs to provide a feedback loop (like "Likes", perhaps call them "Kudos" or "Rep") based on accuracy or other measures of veracity, and when articles with sufficient Kudos are shared, articles from those authors/sources are boosted. On the other hand, when authors or news sources have to publish corrections, are refuted by more trusted sources, or are found to have misled or lied, their ratings should drop, and they should unceremoniously be dropped from the "shareable" web-sphere.

Tue, 17 Oct 2017

Interview Study List

For a talk I'm planning to give on how to do better in coding interviews, I compiled a list of "study topics" for those who either have never learned, or may have gotten rusty, at various topics in computer science and programming.

I am not asserting that all these topics must be known by all candidates for all jobs; but rather, if there is an area that a given job is likely to focus on, this structural approach might help candidates delve into an area of study deeper and expand their current context.

Interview Preparation Study List

  • Programming Abstractions
    • Problem Solving Skills
      • Defining and understanding the problem, including constraints and acceptance criteria
      • Validating your assumptions
      • Proposing possible solutions (along with criteria to evaluate them)
      • Capturing data/testing your assumptions
      • Selecting an approach, eliminating approaches that won’t work, are too risky, or take too long
      • Committing to an approach, validating that it is the right path along the way
    • Software Design
      • Clean Code
    • Data Structures & Abstractions
      • Arrays/vectors/strings, stacks, queues, linked lists, hash tables, trees
    • Recursion
    • Searching and sorting
    • Algorithmic analysis (e.g. “Big-O” notation)
  • Computer Organization & Computer Systems
    • Machine architecture (registers, I/O, basic assembly language)
    • Memory models (pointers, memory allocation, data representation)
    • Compilation (stack frames, semantic analysis, code generation)
    • Basic concurrency (threading, synchronization)
    • System processes (context switching, inter-process communication)
    • Storage and file management (file systems, virtual memory)
    • Caching (including memoization, memory/filesystem caches)
    • Networking (sockets, TCP/IP, routing)
      • Fallacies of Network Computing
    • Distributed systems
    • Database systems
      • Graph vs. Relational Strategies (SQL, NoSQL)
      • ACID (and how a database achieves this; i.e. row/table based locking)
      • Schemas/Schema Design
      • How databases can achieve high performance (indexes, normalization/denormalization)
      • Data Modeling
  • Computing Theory
    • Logic
    • Functions
    • State Machines
    • Regular Expressions
    • Complexity Analysis
    • Little’s Law
    • Serial/Parallel computing
    • Hashing
    • Data analysis
    • Machine learning principles
  • Probability
    • Conditional probability
    • Probability distributions
    • Bayes' Theorem
    • Law of Large Numbers/Central Limit Theorem
  • Algorithms
    • Algorithmic complexity & efficiency
    • Time/space efficiency
    • Computational strategy (divide/conquer, greedy, hashing, randomized algorithms, graph, search algorithms)
  • Domain Knowledge (broad spectrum)
    • Project/Program Management (Agile, Lean, Scrum, Kanban, Conway’s Law, Parkinson’s Law, Mythical Man Month)
    • Software Deployment & Delivery (SDLC, Code branching/flow, Source code management, Deployment Strategies)
    • Operational resiliency/scalability (Datacenter, Cloud, Loadbalancers, Read replicas, CQRS)
    • Software Architecture (Domain Driven Design, UML Context & Sequence Diagrams, Class Diagrams)
    • Full stack development (Databases, Web Servers, Caches, Edge-Caching, Browser Caching, client code/performance, JS/CSS frameworks)
    • Computer Images/Graphics (bit depth, compression strategies, PNG vs. JPG, etc., Vector vs. Bitmap)
    • Semantic Content (SGML->HTML, Metadata, Taxonomies, Ontologies)
    • Big Data, Machine Learning, Recommendation Systems, Rules Engines, Heuristics


Written using MacVim
Published by Blosxom
Layout: Blueprint CSS