Technical product manager and customer-focused software engineer with experience guiding projects from discovery through development and shipping. Areas of specialty include customer experience, curriculum products, e-commerce, rapid prototyping, MVP design and development, as well as startup and turnaround strategy.

From years of experiencing a wide range of environments, I have come to prefer a fast-paced and solution-oriented culture with cooperative, candid teammates. Whether on a 2-week contract for a Fortune 500 or a 2-year run with a startup, I foster strong, lateral communication with all stakeholders, striving to influence without leaning on authority.




"The limits of my language
mean the limits of my world"
- Wittgenstein



{{ skill }}
const myIndex = apiClient.initIndex('contacts');
myIndex
  .addObject({
    firstname: 'James',
    lastname: 'Raynor',
    company: 'Jimmy & Sarah's Cafe'
  })
  .then(content => console.log(content))
  .catch(err => console.error(err));

describe('When there are no videos', () => {
  it('the videos container should be empty', () => {
    browser.url('/');
    assert.equal(browser.getText('#vid-wrapper'), '');
  });
});

myIndex = apiClient.init_index("contacts")
myIndex.add_object({"firstname": "James",
                    "lastname": "Raynor",
                    "company": "Jimmy & Sarah's Cafe"})

my_index = Searchgem::Index.new('contacts')
my_index.add_object :firstname => "James",
                    :lastname => "Raynor",
                    :company => "Jimmy & Sarah's Cafe"

Index myIndex = apiClient.InitIndex("contacts");
    var jsonObject = new JObject();
    jsonObject.Add("firstname", "James");
    jsonObject.Add("lastname", "Raynor");
    jsonObject.Add("company", "California Paint");
    myIndex.AddObject(jsonObject);

daily_players AS ( 
  SELECT 
    date(created_at) AS dt, 
    count(DISTINCT user_id) AS players 
  FROM gameplays 
  GROUP BY 1 
)


query Hero($episode: Episode, $withFriends: Boolean!) {
  hero(episode: $episode) {
    name
    friends @include(if: $withFriends) {
      name
    }
  }
}

                
<div id="search"></div>
<div id="hits"></div>

<script>
  const { searchBox, hits } = instantsearch.widgets;
  search.addWidget(searchBox({ container: "#search" }));
  search.addWidget(hits({ container: "#hits" }));
  search.start();
</script>

using UnityEngine;
public class DestroyBasic : MonoBehaviour
{
  void Update()
  {
    if(Input.GetKey(KeyCode.Space))
    {
      Destroy(gameObject);
    }
  }
}

            
<ais-index>
  <ais-search-box />
  <ais-results>
    <template scope="{ result }">
      <h2>{{ result.name }}</h2>
      <p>{{ result.description }}</p>
    </template>
  </ais-results>
  <ais-refinement-list attributeName="company" />
  <ais-pagination />
</ais-index>

const App = (
  <InstantSearch>
    <SearchBox />
    <Results />
    <Pagination />
    <RefinementList
      attribute="company"
    />
  </InstantSearch>
);

@Component({
  selector: 'search-ui',
  template: `
    <input type="search" (input)="search()">
    <div *ngFor="let result of results">
      {{result.title | highlight}}
    </div>
    `
})
export mysearch(App);

<div id="chart"></div>

<script>
  d3.select('#chart')
    .selectAll("div")
    .data([1, 4, 8, 14, 15, 38, 42])
    .enter()
    .append("div")
    .style("height", (d) => d + "px")
</script>

$total: 10;
$step: 360deg / $total;
.ray {
  height: 30px;
}
@for $i from 1 through $total {
  .ray:nth-child(#{$i}) {
    background: adjust-hue(blue, $i * $step);
  }
}




Genuine People
Beauty by Adelina
UCSF Sirota Lab

"Each problem that I solved became a rule which
served afterwards to solve other problems."
- Descartes



Gameplan
Beauty by Adelina
Genuine People

{{ products[selection].name }}

Problems

  • {{ problem }}

Solutions

  • {{ solution }}

Results

  • {{ result }}

0