Archives

 Por PABLO REPOND

De acuerdo a los últimos datos estadísticos, el 13% de la población de Argentina tiene algún tipo de discapacidad y, de las que se encuentran en edad laboral, el 75% se encuentra desocupada. Asimismo, de acuerdo a estudios privados, más del 70% de las empresas radicadas en Argentina no tiene como empleados a personas con discapacidad, y menos del 40% de las firmas cuenta con una política que promueva la inclusión laboral frente a la discapacidad. Estas cifras son un llamado urgente a analizar cuáles son las causas que generan las evidentes dificultades que tenemos a la hora de incluir de personas con discapacidad en las empresas.

¿Qué es la discapacidad? La discapacidad tiene origen en el estado de salud de una persona, aunque también se alimenta de cómo la persona con discapacidad se desenvuelve en sociedad. Es común que sea la sociedad la que haga notoria o acentúe los efectos de la discapacidad. Por eso, podemos afirmar que la discapacidad constituye un fenómeno social.

En atención a lo anterior, el Estado y los miembros de la sociedad son llamados a crear ambientes inclusivos para todos, siendo este un trabajo que le compete a todos como integrantes de la sociedad, ya que las personas con discapacidad son individuos de pleno derecho y como tales deben encontrarse en igualdad de condiciones también en el mercado laboral.

La Convención sobre los Derechos de las Personas con Discapacidad (a la que en adelante nos referiremos como la “Convención”), cuyo texto fue aprobado por las Naciones Unidas hacia fines de 2006 y ratificada luego por nuestro país mediante la Ley N° 26.378, al referirse a las Personas con Discapacidad incluye a aquellas que tengan deficiencias físicas, mentales, intelectuales o sensoriales a largo plazo que, al interactuar con diversas barreras, puedan impedir su participación plena y efectiva en la sociedad, en igualdad de condiciones con los demás. Vemos como la Convención misma recalca que la interacción con las barreras que una sociedad presenta juegan un papel determinante a la hora del desenvolvimiento de la persona con discapacidad.

Por otro lado, la Ley N° 22.431, promulgada en 1981, instaura el Sistema de protección integral de los discapacitados (en adelante, el “SPID”) y se refiere a la persona con discapacidad como aquella que padece de una alteración funcional permanente o prolongada, física o mental, que en relación a su edad y medio social implique desventajas considerables para su integración familiar, social, educacional o laboral. De nuevo, vemos cómo el medio social juega un roldecisivo en las desventajas que la persona puede enfrentar para su integración social.

Siendo la discapacidad un fenómeno social que surge del entorno que rodea a la persona, es función del Estado, de la sociedad entera y de las empresas orientarse al derribo de las barreras y así alcanzar una mayor inclusión laboral. Pero ¿cuáles son esas barreras?

Las barreras son diversas, pero en este artículo queremos hacer especial mención a la falta de información sobre la discapacidad y la inclusión laboral que, a su vez, genera grandes prejuicios elaborados sobre bases o fundamentos erróneos.

A su vez, buena parte del desconocimiento que opera como una barrera al que hicimos mención en el punto anterior es aquel referido al marco legal y el objetivo de este trabajo se vincula con que las empresas interioricen su contenido.

En la propia Convención se reconoce el derecho de las personas con discapacidad a trabajar en igualdad de condiciones con las demás, en un entorno laboral abierto, inclusivo, accesible y garantizando los mismos derechos que cualquier otro empleado detente.

De su texto también surge que los Estados signatarios deben implementar medidas que prohíban la discriminación con respecto a cuestiones relativas al empleo, la continuidad en el empleo y la promoción profesional, adoptar políticas tendientes a promover el empleo de personas con discapacidad y velar para que se realicen los ajustes razonables en los lugares de trabajo para las personas con discapacidad.

A nivel local, el SPID busca neutralizar la desventaja que la discapacidad le puede provocar a las personas, dándole una oportunidad de desempeñar un rol equivalente al que ejerce cualquier otra persona. Paralelamente, la ley resalta que las personas discapacitadas gozarán de los mismos derechos y estarán sujetas a las mismas obligaciones que la legislación laboral aplicable prevé para los restantes trabajadores.

En el marco de dicho sistema, será la Agencia Nacional de Discapacidad indicará qué tipo de actividad laboral o profesional puede desempeñar, expidiendo el Certificado Único de Discapacidad (en adelante, el “CUD”), cuya emisión dependerá de que así sea solicitado por el individuo, y que acredita que una persona tiene una determinada discapacidad. A la persona, el CUD le permitirá acceder a los programas de inserción laboral que el Ministerio de Trabajo, Empleo y Seguridad Social (en adelante, “MTEySS”) administra, mientras que a las empresas la existencia del CUD del empleado le permitirá acceder a los beneficios impositivos a los que nos referiremos más adelante.

El SPID establece también una gran ventaja para aquellas empresas que pretendan actuar como contratistas del Estado, ya que a esos fines se priorizarán las compras de insumos y previsiones a aquellas empresas que contraten a personas con discapacidad.

El SPID obliga, asimismo, al Estado Nacional, sus organismos descentralizados o autárquicos, los entes públicos no estatales, las empresas del Estado y la Municipalidad de la Ciudad de Buenos Aires a ocupar personas con discapacidad que reúnan las condiciones de idoneidad para sus puestos en una proporción no inferior al 4% de la totalidad de su personal y a establecer reservas de puestos de trabajo a ser exclusivamente ocupados por ellas.

La norma establece, a su vez, que dicho régimen es obligatorio para el personal de planta efectiva, para los contratados y para los casos de tercerización. Paralelamente indica que, a los fines de cumplir dicho cupo, las vacantes deberán prioritariamente reservarse a las personas con discapacidad que acrediten las condiciones para el puesto.Sin embargo, se conocen numerosos casos en los cuales el Estado y los organismos mencionados no cumplen con el cupo.

La pregunta que surge entonces es si resultaría eficiente a los fines de lograr la inclusión laboral incorporar un cupo similar que aplique para las contrataciones de las empresas privadas. Sería necesario revisar que impacto tendría una medida de esas características.

Otros países sudamericanos han optado por aplicar los cupos también en el sector privado. Ello sucedió en el año 2012 en Perú, con su Ley General de la Persona con Discapacidad, y más recientemente en Chile, a través de su Ley de Inclusión Laboral de 2017, como Perú, mediante su Ley General de la Persona con Discapacidad.

Los Programas de Empleo e Incentivos Económicos

 El MTEySS administra dos programas que, mediante beneficios económicos, promueven e implican la inserción de personas con discapacidad en empresas y para los cuales el CUD debe estar vigente. Nos referimos al Programa de Inserción Laboral (“PIL”) y a las Acciones de Entrenamiento para el Trabajo (“AET”).

El PIL para trabajadores con Discapacidad busca la inserción de los trabajadores con discapacidad, mediante incentivos económicos a los empleadores para su contratación.  Es así que al trabajador se le otorga una suma que varía según si el empleo es a tiempo completo ($ 4850) o a tiempo parcial ($ 2400), durante 12 meses. Este importe podrá ser descontado por la empresa del valor total de la remuneración que se le paga al empleado. Más allá de lo anterior, las contribuciones a la Seguridad Social serán calculadas sobre la totalidad del salario, y estarán a cargo del empleador.

Para gozar de este programa y sus incentivos es necesario que la persona con discapacidad no perciba en paralelo una prestación por desempleo ni otro soporte económico correspondiente a otros programas sociales, de empleo o capacitación laboral.

Por otro lado, tenemos el Programa de AET que busca que la persona con discapacidad gane experiencia mientras se promueve la inserción laboral. Otorga también incentivos económicos a las empresas para que entrenen a estas personas, teniendo luego de finalizado el Programa la posibilidad de incorporarlos como empleados. Se destaca que durante el Programa no estamos en presencia de una relación laboral, sino que se trata de un acuerdo de entrenamiento. Habrá una ayuda económica mensual a cargo del MTEySS o en forma conjunta con la empresa, que será en total de hasta $ 3600 y con una carga horaria de 20 horas semanales. El aporte de la empresa dependerá de si se trata de su tamaño: si es una micro empresa será de $ 0; si es una pequeña empresa, $ 350; el aporte de las medianas empresas será de $ 800 y el de las grandes empresas  será de $ 1750. El importe faltante para cubrir el total lo aportará el MTEySS.

Como requisitos a cumplir del lado de la empresa, encontramos el de designar un tutor por cada 10 participantes, garantizar una cobertura de seguros de accidentes personales y un plan médico obligatorio. Es necesario también que el trabajador no se encuentre percibiendo la prestación por desempleo ni ayudas económicas de otros programas sociales, de empleo o capacitación laboral y se encuentre inscripto en la base de datos del MTEySS

Otro programa, administrado también por el MTEySS, que busca promover el desarrollo laboral y mejorar el acceso al empleo en donde intervienen entidades privadas son los Grupos Laborales Protegidos, instituidos por el Régimen Federal de Empleo Protegido para Personas con Discapacidad de la Ley 26816 (“RFEP”). Estos grupos son secciones o células de empresas públicas o privadas constituidas íntegramente por trabajadores con discapacidad, que contarán con personal de apoyo integrado por servicios profesionales de técnicos, especialistas o personal idóneo, los cuales estarán financiados por el régimen. Estos grupos implicarán secciones o células de 2 trabajadores en empresas con hasta 20 trabajadores, 3 trabajadores en empresas con hasta 50 trabajadores y 6 trabajadores como mínimo en empresas con más de 50 trabajadores. Este régimen les garantiza a los trabajadores en él encuadrados, las prestaciones del artículo 17 de la ley 24241, cobertura médico asistencial del Sistema Nacional del Seguro Salud, asignaciones familiares y prestaciones dinerarias y en especie de la ley de Riesgos de Trabajo. Asimismo, para acceder a la Prestación Básica Universal del art. 19 de la ley 24241, se requerirán 20 años de aportes y la edad 45 años, si acreditan que durante los 10 años anteriores al cese o a la solicitud del beneficio prestaron servicios en Grupos Laborales Protegidos.

Beneficios Impositivos para las Empresas a Nivel Nacional

Veamos ahora cuales son los beneficios de carácter tributario que las empresas reciben en caso de emplear personas con discapacidad:

Por un lado, el SPID determina que los empleadores que concedan empleo a personas con discapacidad tendrán derecho al cómputo, a opción del contribuyente, de una deducción especial en la determinación del impuesto a las ganancias o sobre los capitales, equivalente al 70% de las retribuciones correspondientes al personal con discapacidad en cada periodo fiscal. Además, a estos fines se va a tener en cuenta a aquellos empleados que realicen el trabajo a domicilio.

Por otro lado, es importante tener en cuenta que el RFEP  dispone que los empleadores que contraten a personas con discapacidad que hayan participado en los programas que dicho Régimen establece, tales como los Talleres Protegidos Especiales para el Empleo o los Talleres Protegidos de Producción, podrán computar una deducción especial en la determinación del impuestos a  las ganancias equivalente al 100% de las remuneraciones brutas abonadas correspondientes al personal con discapacidad en cada período fiscal.

Por último, la Ley de Empleo dispone otro beneficio eximiendo a los empleadores que contratan por tiempo indeterminado a trabajadores con discapacidad del pago del 50% de las contribuciones patronales y a las cajas de jubilaciones correspondientes, al Instituto Nacional de Servicios Sociales para Jubilados y Pensionados, a las cajas de asignaciones y subsidios familiares y al Fondo Nacional de Empleo, por el período de un año.

Sin perjuicio de lo anterior, es importante tener en cuenta que, dependiendo de las características de la empresa, pueden también resultar de aplicación los beneficios descriptos en los Regímenes Especiales de Promoción del Trabajo Registrado de la ley de Promoción del Trabajo Registrado y Prevención del Fraude Laboral Ley N° 26.940 y en el régimen de Promoción y Protección del Empleo Registrado de la Ley de Regularización Impositiva Ley 26.476, que implicarán una reducción de sus contribuciones con destino a la Seguridad Social.

Resulta esencial que el Estado, las asociaciones de empresas y las cámaras empresariales difundan estos incentivos para que, dejando atrás la ignorancia y acogidos por estos regímenes, se promueva la inclusión laboral.

Una vez cumplida la debida difusión de estos regímenes, y atendiendo a nuevos datos estadísticos, se deberá evaluar si han logrado los objetivos perseguidos, si han resultado eficientes, y consecuentemente si deben ser ajustados de alguna manera.

Consideraciones sobre la incidencia de la Ley de Contrato de Trabajo

Otra barrera a la inclusión es la falta de conocimiento de las empresas respecto de cómo aplican las normas del Derecho del Trabajo y sus principios protectorios favorables al empleado en el caso de que este último sea una persona discapacitada. No sorprendería la actitud de un empresario absteniéndose de contratar a una persona con discapacidad por temor a que, a través de alguna interpretación rebuscada de las normas laborales, tenga que enfrentar un posible reclamo laboral de gran envergadura.

Veamos entonces cómo juegan los derechos y obligaciones laborales en estos casos:

Como dijimos más arriba, las personas con discapacidad tienen los mismos derechos y obligaciones que cualquier otro empleado. Pero, ¿qué sucede con el empleador? De la misma manera, el empleador tiene las mismas obligaciones que en cualquier otro vínculo laboral, no hay diferencias de ningún tipo y el mismo criterio aplica respecto de los exámenes médicos obligatorios previos al inicio de las tareas: se realizan al empleado tenga o no discapacidad.

En relación a los procesos de salida de los empleados, aplican las mismas reglas contra el despido arbitrario, por lo que destacamos que a la hora de la desvinculación se deben seguir los mismos pasos que con cualquier otro empleado. En ese aspecto, resultará beneficioso brindar durante toda la relación laboral la retroalimentación al empleado sobre su rendimiento y documentarse, para encontrar las mejoras que sean necesarias previo a un eventual despido sin causa.

Por último, y como en cualquier otro caso, también resultará aplicable la Ley contra Actos Discriminatorios, de manera que se reparen los daños y cesen los efectos de los actos que arbitrariamente menoscaben de algún modo el ejercicio igualitario de los derechos constitucionales.

A los fines de mejorar las estadísticas mencionadas al inicio del artículo, destacamos que será clave que el Estado asuma un rol más activo en campañas de promoción de la inclusión, divulgando por distintos canales información sobre la discapacidad, sus tipos y sobre las normas aplicables. También será igualmente importante el papel que juegan las empresas que ya cuentan con políticas vinculadas a su responsabilidad social y tengan programas de inclusión laboral, compartiendo sus experiencias con el resto de las empresas y a la sociedad en su conjunto. Ello nos llevará a tener una sociedad más equitativa en donde todos sus miembros tengan igualdad de oportunidades.

Lee la nota completa ACÁ

If you haven't heard about Gatling, here’s your chance to get acquainted with it!

A few months ago, I was called to help on a Performance time-fix project, where I put my skills to the test with this code-like scripter.

I was assigned to a time box project where we needed to run as many performance tests as we could, detect problems, do the improvements, run the tests again, satisfy the customer, keep both parties happy, THE END.

At that moment, my only link or knowledge of Gatling was just of its name. I had read something and played a bit with JMETER and thought: well, probably it’s pretty much the same. But soon into the project I realized, that they were VERY different.

First of all, if you are still asking yourself what it is: in a nutshell, Gatling is code-like scripting that enables you to easily maintain your testing scenarios and automate them in your continuous delivery pipeline. With only a few machines, you can simulate hundreds of thousands of requests per second on your web application and get high-precision metrics.

One cool thing about Gatling is how easy it is to get started. It gives you the option to get a bundle: the most common thing you need to run a straightforward test. The other option is getting it from Maven, like we usually do on big projects.

I was very lucky, since Gatling was already setup and my main task was to create the simulations we needed, run them, analyze, help to make decisions to improve the actual performance and then re-test.

Another cool thing about Gatling is the simple way you can create Simulations, apart from the fact they are written on Scala (it was also my first time using Scala, and found it was not hard to learn), it is very easy to read and write scenarios. However, I strongly recommend to be sure about what you need to test. You need to understand correctly how Gatling creates users, concurrent user behavior, and what Gatling defines as “users”. The latter may lead to misunderstandings or, worst-case scenario, you will lose lot of time trying to figure out what is going on with the results you are getting. In conclusion, be sure what test cases you really need to run ( the exact steps ) and be sure you know and understand how Gatling defines users (it will help to play around with some executions and see what happens).

Back to my story.

Gatling was already setup, and one simulation was created, so I started from there, re-defined it as we needed and started with the executions. The executions were the second tricky part for me because I was hoping to just run something local like I was used to, but the reality was another. The way we ran the tests was particular: we had to connect to a remote machine (a simple linux server machine), execute the simulations by command line, and watch the logs from there. One of the devs from the team opened a port from that computer to our internal network, so the Gatling html was available to us as evidence for the analysis.

After several executions we finally identified some problems, and managed to solve them as fast as we could to re run the tests. It may sound very easy, but it was not the case. I clearly remember spending almost a week trying to figure out what had actually happened, to then find possible solutions, inform the client, make necessary changes and of course re test.

On one hand, it was a bit stressful, because the executions took time, and if we made a mistake that would have mean we would have to re execute, again and again. On the other hand, it was rewarding to see that the changes we made were successful and helped us to move on. By the end of the assigned time, we managed to almost reach the client’s objective.

What did I learn from this experience? Well, to be really honest, I learned mainly how Gatling works: how a test is made, how to execute it, what things to consider before running simulations. Although I don't consider myself an expert, I know for sure I learned the basics and more. Also, I learned what things you may consider when dealing with Performance testing, and what things, as a QA engineer, you may propose or start doing.

What should I have done better? At some point when issues became downright technical on subjects I didn't have a clue, I decided to take a step back and let the developers take control. In retrospect, I should have been more proactive and perhaps read, search, helped out more when such cases arose.

My final three insights for you, my readers, are:

1- Thanks for reading about my experience! I sincerely hope you found it useful.

2- If you are interested on starting Performance testing, take a chance with Gatling.

3- Share your experiences!

Metrics…no one truly likes them, but let’s be honest: they are very useful in our daily work, once we know what they are and how to use them.

Let's begin by defining what a metric is. There are two approaches we can focus on:  the formal approach or the common approach.

The formal approach defines metrics as:

 ..a recurring measurement which possesses an informational, diagnostic, motivational or predictive power of some kind”.

The common approachs states that a metric is a regular measurement we get in order to have  reliable and objective information we can use to make decisions.

Now that we know what a metric IS, let's move on to what they are used FOR. Within the  the definition of the common approach is a clue: they help us measure what has happened and predict what could happen.  Any metric that provides us with this type of information can help guide work in progress and monitor its iprovements.

It is very common to associate metrics with any type of leadership or management role.  However,  we have to keep in mind that metrics should be easily understood by any team member and stakeholders, for they are key indicators of progress and impact. This being said, it is important for a team to be able to define and work with metrics which best fit them, respecting the team's uniqueness and its specific objectives.

How do we identify a “good” metric? It's very simple! Just remember you are S.M.A.R.T.:
Specific, Measurable, Achievable, Relevant & Time-bound.

Now that we are clear on  what metrics are and what they are for, let’s get to the good stuff: EXAMPLES.

There are lot of differents metrics you can search, apply and use daily, In this essay we will review  some of the most commonly used. However, as mentioned before, each team needs to identify the ones that are most suited to their objectives and personality.

In order to classify metrics we can talk about the ones that help guide a project, usually used by Managers to supervise its progress.  We can also talk about metrics that help monitor a team while improvements are performed. To keep it simple, we are going to describe two of each category:

Burn Charts. They show  how the team delivers during the evolution of a project, based on empiric measurement. It refelcts the quantity of work done (a.k.a Burn-Up ), or can show the quantity of work that still needs to be done ( a.k.a Burn-down).

Burn Charts help identify whether the team will fulfill the delivery target, indicate how much time the team needs to achieve it, and show  details of the progress of completion at specific date. For this information to be as accurate as possible, it is crucial that all team members take on the responsibility of updating tasks and observations accurately.

Cumulative Flow. Also known as CFD, it is a visual representation of the completed  work and its progress. The graph indicates the bottlenecks, the dates where a partial delivery is possible, identifies where the big components are, and so on. It is very similar to a Burn Chart, the difference being that a CFD can provide more detailed information regarding  quantity of progress achieved or yet to be achieved.

Velocity.  This metric measures the quantity of work completed during an iteration, helping reduce the variations and improve predictability for future ones. It indicates  whether a team's deliveries are or are not incremental, and reveals if delivery is consistent and predictable throughout a certain period of time.

Niko Niko Calendar.  Since people are key factors within the measurement system, this metric is about and for them! It shows the emotional state of each team member over time, based on a simple daily check of their mood registered in 3 states:
Positive, Neutral and Negative.

This information allows us to forsee any systematic problems that can affect the team's morale. It could also detect any issues during the project's evolution. Since it is designed to measure people, it can be useful for Managers by providing them with feedback to help  evaluate how they are overseeing and working with their teams.  It is important for each team member to be honest and transparent for the use of this metric to be effective.

Enclosed are some other metrics that are commonly used and could be of interest:

  • Percentage of Scope Complete
  • Earn Value
  • Budget Burn
  • Buffer Burn Rate
  • Earned Business Value
  • Cycle Time
  • Throughput
  • Process Cycle Efficiency
  • Version Control History
  • Static Code Analysis Metrics
  • Emotional Seismogram
  • Happiness Index
  • Ball in Bowls
  • Health and Happiness
  • Personality Type Profiles

Depending on the characterics of a team and its goals, there are many different metrics that can be  customized for specific needs or personalities. But most importantly,
metrics requires and encourage team work. As John Dunne once stated,
"No man is an island".

¿Te gustó el artículo? También podes leerlo acá

Majority of people believes that being a QA is simply a monkey who plays around with the product (which could be a mobile app, a desktop app and so on) , who is the noisy person on the team, the one that is always asking, always questioning, and also do not forget … always finding what is working wrong.

The truth is…. yes, we are the ones that probably detect things that are incorrect, but we also are the agents of quality. And you maybe ask then.. What is quality? Why would you call this people “agents”?

Quality is a well know concept, as per definition says:

“the standard of something as measured against other things of a similar kind; the degree of excellence of something.”

 

When we talk about software quality usually also means (or that is the belief ) that the product of software is bullet proof,meaning that not matter what could happen it will work just fine. In reality, we know that is not possible and that is why we work on degrees of quality and acceptance criteria.

So quality by definition means excellence, and the QA are here to work on that, to pullish the product as much is necessary to get the better shine, we are here to do the questions that nobody wants to ask, to questioning so we can be heard, so new ideas and unknown flows can be discovered.

And why I said previously “agents” of quality? While it is true that we help to assure a degree of quality for a product ( pay attention here I said “we help”, because all people involved in the software product is somehow responsible for the quality of it) we are also responsibles for the quality of the process in which that product is being created, and that is why I like to call us “agents”. We make ourselves accountable for each functionality we work on, meaning that we are not only responsables but also of that functionality.

We look for the good and sanity of the process as a whole, from the beginning till the end of it. From the moment a Client starts to give us the details of a future project till the moment we perform a demonstration and show them the result. Sometimes we go beyond that and give support for the maintenance of the product once is launched or even are there to applied new changes and assured the functionality continues to work as expected.

As agents of quality we care about the quality of the product, the standards which are followed, the methodologies used, and one particular thing we always have in mind is improvement. Constantly we are looking for better ways to do our job, better ways to reach the goal, to satisfy the client, to improve the process, a better way to be the best agents.

Lee el artículo en el Medium de Tamara Torres

Por Homero Aguillon, UX Designer de GlobalLogic

La Experiencia de Usuario (UX, por si siglas en inglés) tiene que ver con aprender el ciclo de desarrollo de los productos digitales, tomando el enfoque del diseño centrado en el usuario. Esto implica investigar y analizar a las personas para luego volcar ese conocimiento en el desarrollo integral de un producto.

Dado los resultados de aplicar buenas prácticas de UX en el ámbito de las soluciones digitales, hoy se habla de UX Strategy,  que consiste en alinear la Experiencia de Usuario, la estrategia comercial y los objetivos de la organización. Esto conlleva un cambio: dejar de pensar en el Diseño de Experiencia de Usuario (UXD) solamente al desarrollar productos, y adoptar su filosofía a toda la organización. Algo que, definitivamente, impacta en la cultura de la empresa y la forma de trabajar.  

En concreto, las firmas que quieran avanzar en este sentido, deben considerar cuatro pilares fundamentales: las metas de negocio, que deben establecerse a corto, mediano y largo plazo; la necesidad de innovar de forma constante en función del ritmo del mercado, lo que implica incorporar las metodologías ágiles; sumar instancias de investigación continuas y exhaustivas; y aplicar el UXD en los procesos internos.

Si bien este cambio en la manera de concebir el negocio toma su tiempo, lo cierto es que hay firmas que han logrado dar un salto cuanti y cualitativo en su negocio al adoptar este tipo de estrategia. Por caso, Apple es un claro exponente de cómo la Experiencia de Usuario va más allá de los productos puesto que también se vivencia en los puntos de venta. Lo mismo sucede con Amazon, y hasta con otras firmas más nuevas como Airbnb y Uber, en donde todo gira alrededor de las necesidades del mercado.  Otro ejemplo curioso es el de Mach de BCI, una plataforma de compra online que facilita la compra en el exterior a través de una tarjeta virtual VISA, sin pagar comisiones, y a través de simples pasos.

La principal barrera: la resistencia al cambio

Por definición, las personas sentimos aversión a los cambios. Por eso, las organizaciones que deseen incorporar una estrategia de Experiencia de Usuario deben establecer un plan que tenga por objetivo transformar la cultura de la empresa. En este sentido, la banca es un buen ejemplo. Muchas compañías de esta industria, con una fuerte tendencia a trabajar bajo el modelo tradicional, están avanzando para adoptar esta nueva forma de pensar y actuar. Para eso, y con el objetivo de agilizar este proceso, están comprando fintechs para hacerlas parte de su negocio, ya que los colaboradores de estos emprendimientos de base tecnológica tienen el ADN necesario para entusiasmar al resto.  

Las empresas que quieran avanzar hacia una estrategia de UX, deben entender el mercado y a los clientes a los que apuntan, para luego generar nuevos productos alineados con esto. En este punto, es preciso recordar que una buena marca se puede desvalorizar con un solo producto mal hecho; pero no a la inversa.  

Por supuesto, todas las organizaciones tienen la opción de adoptarla o no. De todos modos, es buena idea considerar salir de la zona de confort para seguir siendo competitiva, y estar más en sintonía con el pulso del mercado.

 

This is a quick tip to update our FCM stuff in our app targeting to API 26 (Oreo).

Last week, I had to update the current app (changing the targetSdkVersion to 26) to support Android Oreo (8.0). Everything works great (in previous versions) but in Oreo that was not the happy case. The notifications were not working as expected: the app was crashing when a push notification was received by device. This was the exception in logcat:

Fatal Exception: java.lang.RuntimeException: Unable to start receiver com.google.firebase.iid.FirebaseInstanceIdInternalReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.google.firebase.INSTANCE_ID_EVENT pkg=PACKAGE cmp=COMPONENT }: app is in background uid UidRecord{c5e5e69 u0a325 RCVR bg:+1m25s411ms idle procs:1 seq(0,0,0)}
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3397)
at android.app.ActivityThread.-wrap18(Unknown Source)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1780)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Well, I’ll be honest and I should confess that I wasted one day researching information about this problem. In addition, the project has a gradle file with a lot of dependencies to be used in every module. This distribution helps to keep all dependencies in one place and then make a reference to them from the specific build.gradle file.

Research the problem

After make a quick research about the problem, the main cause was: “Not allowed to start service”. This message is thrown from Android system when you try to start a service when the app is in background or it is not running. That was the starting point. All posts were referenced to Background Execution Limits: the best solution is create a notification receiver in the middle to execute the service as it matches. First mistake: that was not I have in my code. Using Firebase Messaging Cloud, there was not place where a service was starting. So? Are there other solution?

Well, the main problem was the FCM version I had: it was pointing to 8.4.0 which it does not support Oreo.

Update FCM at least to 11.2.0

After play around on this, I figured out the FCM version 11.4.0 supports Android Oreo. Actually, Oreo support was introduced in 11.2.0. You can use whatever you want.

dependencies {
compile 'com.google.firebase:firebase-core:11.4.0'
compile 'com.google.firebase:firebase-messaging:11.4.0'
}

The official documentation suggests use 11.8.0 instead. Again, you can choose whatever you want.

“Nice, so that’s all, right?” Well, not really. Oreo introduced a new concept for notifications named Notification ChannelsAll notifications must be assigned to a channel or it will not appear. So, if we have our app targeting to API 26 and we should display a notification for any reason, we must assign it to a channel. Otherwise, you will get a warning toast message like this one:

Assign Notification to a channel

The first step is create a channel id. The best place to create one is in strings.xml file.

<string name="default_notification_channel_id" translatable="false">fcm_default_channel</string>

Then, you must add a meta-data in manifest file to enable it:

<application>
...
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
</application>

Perfect, our last step is the assignment on code side. In the same place where you are calling to notify method to display the notification, you should add the channel assignment:

...
// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = context.getString(R.string.default_notification_channel_id);
NotificationChannel channel = new NotificationChannel(channelId, title, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(body);
mNotificationManager.createNotificationChannel(channel);
builder.setChannelId(channelId);
}
mNotificationManager.notify(1, notification);
...

And that’s it! Now the app should work on devices with Oreo.

You can check the following repo to make sure you are doing it in a right way:

firebase/quickstart-android
quickstart-android - Firebase Quickstart Samples for Androidgithub.com

Please, feel free to comment, suggest or ask anything you want. Happy coding!

Read the article in Medium

These days, ReactiveX is the most popular approach to take for asynchronous programming. Focusing on mobile development, it is the best way to call to any API and manage data using Observer pattern.

Light introduction to Rx

If you already have knowledge in Rx, jump to the next section of this article.

ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.

It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety, concurrent data structures, and non-blocking I/O.

If you want to learn more about Rx, please check this post:

Observer’s implementation

One of the types more used is Observable. Then that observer reacts to whatever item or sequence of items the Observable emits. This pattern facilitates concurrent operations because it does not need to block while waiting for the Observable to emit objects, but instead it creates a sentry in the form of an observer that stands ready to react appropriately at whatever future time the Observable does so.

The Subscribe method is how you connect an observer to an Observable. Your observer implements some subset of the following methods:

  • onNext: An Observable calls this method whenever the Observable emits an item. This method takes as a parameter the item emitted by the Observable.
  • onError: An Observable calls this method to indicate that it has failed to generate the expected data or has encountered some other error. It will not make further calls to onNext or onCompleted. This method takes as its parameter an indication of what caused the error.
  • onCompleted: An Observable calls this method after it has called onNextfor the final time, if it has not encountered any errors.

Defining project structure

First of all, I want to share with you a basic project structure, taken from Android pattern:

Project structure

This structure has three folders that include all functionality

  • Data: contains the access to repositories, like databases, api calls, cache, entity. Also, includes the mappers to transform an entity to a model class
  • Domain: contains the business model, the use cases and expose the repositories (as interfaces)
  • Presentation: this is the UI. This contains the views and viewmodel or presenter classes (depending of the chosen pattern)

The communication flow should be:

Presentation <-> Domain <-> Data

Integrating Rx.NET in Xamarin

Up to here, we have learned about Rx in general. Now, we will focus in how we can implement this in Xamarin. For do that, we will need add Rx.NET plugin to our project (and all referenced projects)

Let’s think in a basic app that populates a data in a list view. So, the first step is call from our UI to retrieve data. I’ll base in a sample that shows a list of cities.

We call to our Presenter to retrieve the data

 void UpdateData(bool forced)
{
UpdateViewState(ViewState.Loading);
Presenter.LoadCities(forced);
}

Then, from our Presenter we need to call to our use case

public void LoadCities(bool forced)
{
var useCache = !forced;
UseCase.Execute(new CityListObserver { Presenter = this}, new Params { UseCache = useCache });

View.OnLoadingStart();
}

Keep in mind, we need to provide an Observer to listen any changes on data.

class CityListObserver : DefaultObserver<List<City>>
{
public CityPresenter Presenter { get; set; }

public override void OnCompleted()
{
// Do nothing for now...
}

public override void OnError(Exception error)
{
if (error.InnerException is HttpRequestException && !App.IsNetworkAvailable())
{
Presenter.View.OnNetworkDisabledError();
}
else
{
Presenter.View.RenderError(error);
}
}

public override void OnNext(List<City> value)
{
Presenter.View.Render(value);
}
}

So, the next step is our Use Case. This will call to repositories

public class GetAllCitiesUseCase : UseCase<List<City>, Params>
{
ICityRepository Repository = new CityRepository();

public override IObservable<List<City>> BuildUseCaseObservable(Params param)
{
return Repository.Cities(param.UseCache);
}
}

public class Params
{
public bool UseCache { get; set; }
}

A repository can be any datastore we have. This is the common repository class to ask to a concrete repository to retrieve the data:

public class CityRepository : ICityRepository
{
CityMapper Mapper = new CityMapper();
CityDataStoreFactory Factory = new CityDataStoreFactory();

public IObservable<List<City>> Cities(bool useCache)
{
var dataSource = Factory.Create(useCache);
var entities = dataSource.Cities();
return entities.Select(x => Mapper.TransformList(x));
}
}

In this repository, we create the concrete DataSource using a Factory. In addition, we are using the Select method to transform each elements of CityEntity list to City list, through to our Mapper. This is how we apply map operator in C#.

This is a local implementation of DataStore:

public class DiskCityDataStore : ICityDataStore
{
public ICityCache CityCache { get; set; }

public IObservable<List<CityEntity>> Cities()
{
return Observable.Create<List<CityEntity>>((emitter) =>
{
var list = CityCache.GetAll();
if (list != null)
{
emitter.OnNext(list);
emitter.OnCompleted();
}
else
{
emitter.OnError(new Exception("Cities were not found"));
}

return () => { };
});
}
}

There, we create an Observable object from our local data.

And that is! We have created a basic flow using Rx.NET library. You can see the full sample in this repo. Feel free to contributefile issues or suggestions! Let’s make a better architecture 😉

Gabriel Kotliar, CTO de GlobalLogic Latinoamerica, en un video para Acámica en el marco del lanzamiento de su carrera de Desarrollo Web Fullstack, creada en colaboración con los líderes de la industria.

https://www.facebook.com/Acamica.org/videos/1565772220143269/

Junto a otras empresas líderes de la industria tecnológica, GlobalLogic te prepara para tu trabajo como profesional web, desarrollando el pensamiento computacional y las habilidades necesarias para construir aplicaciones web robustas y escalables.

Cada día nuestros clientes alrededor del planeta piensan en una idea nueva, tienen una necesidad urgente, o una visión diferente de cómo hacer mejor la vida de muchas personas, y aquí en GlobalLogic buscamos la forma de hacerlo realidad. Pensamos que cada una de esas ideas necesitan trabajo ágil y sobre todo pasión, para darle vida, porque una idea que no se materializa muere. Y es el software el que hoy hace posible innovar y que una idea pueda cambiar la forma de ver el mundo, desde una billetera móvil, un centro de entretenimiento en tu auto, y hasta el nuevo medidor de azúcar en la sangre. Si alguien tiene un nuevo servicio para ofrecer o quiere que el servicio que ofrece a sus clientes sea más rápido, más seguro, o simplemente más divertido, aquí en GlobalLogic no sólo lo hacemos posible sino que también aseguramos su calidad y que los usuarios de nuestros clientes sientan que los productos que utilizan fueron pensado para ellos, y no una especie de invento creado sin pensar en la comodidad de quién lo utilizará. Más 8000 empleados de GlobalLogic alrededor del mundo se olvidan de que el software son líneas infinitas de código, y lo viven más como un lenguaje que le da vida a cada una de las ideas de nuestros clientes, mientras la pasan bien en un espacio divertido, agradable y para nada ese cliché geek que algunos se imaginarían.

Así es el mundo GlobalLogic, con sedes alrededor de todo planeta, y un lugar donde hay mucho más que ver que una pantalla de computadora, donde muchos crecen y se capacitan dentro de la empresa, donde otros viajan constantemente a atender programas ( aca podría decir a trabajar) en diferentes ciudades que resuenan a nivel global, (Namasté), o donde tranquilamente, un día pueden decidir que resolverán esos proyectos que desafían su talento desde sus casas.

De cualquier forma coincidimos en que divertirnos con lo que hacemos y apasionarnos con cada una de las cosas que encaramos, es lo que marca la diferencia en cada uno de nuestros proyectos.

  • URL copied!